本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下:
import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.*.dmp.bean.AgentConfigInfo; import com.*.dmp.bean.MapKeys; import com.*.dmp.bean.RunStatus; import com.*.dmp.common.SpringUtils; public class ExportDataServiceDB2 { AgentConfigInfo agentConfigInfo = SpringUtils.getContext().getBean(AgentConfigInfo.class); private Logger LOG = LoggerFactory.getLogger(ExportDataServiceDB2.class); private StringBuffer resultMsg = new StringBuffer(); String isOK = "0"; private String exportShell = agentConfigInfo.getEXPORT_SHELL(); // private String exportCMD = agentConfigInfo.getEXPORT_CMD(); private StringBuffer exportFilePath = agentConfigInfo.getEXPORT_FILE_PATH(); /** * @Title: ExportData * @Description: 调用Shell脚本实现db2数据的导出 * @param dataMap * @throws IOException 对方法的参数进行描述 * @return HashMap<String,String> 返回类型 */ public HashMap<String, String> ExportData(HashMap<String, String> dataMap) throws IOException { String dbSchema = dataMap.get("db_schema"); String dbUser = dataMap.get("db_user"); String dbPassword = dataMap.get("db_password"); String tableName = dataMap.get("table_name"); String interFile = dataMap.get("inter_file"); String delimiter = dataMap.get("delimiter"); String exportLimit = dataMap.get("export_limit"); String filePath = mkDirectory(exportFilePath, interFile); dataMap.put("file_abs_path", filePath); String cmdPara = createExportShellParams(dbSchema, dbUser, dbPassword, tableName, filePath, delimiter, exportLimit); LOG.info("Export Parameters: " + cmdPara); resultMsg.append("Export Parameters: " + cmdPara + "\n"); String cmd = exportShell + " " + cmdPara; Process ps = null; InputStreamReader isr = null; LineNumberReader input = null; String line = null; try { LOG.info("Run Command: " + cmd ); resultMsg.append("Run Command: " + cmd + "\n"); ps = Runtime.getRuntime().exec(cmd); isr = new InputStreamReader(ps.getInputStream()); // 使用Reader进行输入读取和打印 input = new LineNumberReader(isr); while (null != (line = input.readLine())) { LOG.info(line); resultMsg.append(line); if (line.contains("failed") || line.contains("Failed") || line.contains("FAILED") || line.contains("错误")) { isOK = RunStatus.EXPORT_FAIL; dataMap.put("export_status", isOK); dataMap.put("proc_log", resultMsg.toString()); // dataMap = packageResult(isOK, resultMsg.toString()); // 组装返回的消息 return dataMap; } else { isOK = RunStatus.PROC_RUN_SUCCESS; } } // if (0 != ps.waitFor()) { // isOK = RunStatus.EXPORT_FAIL; // } else { // isOK = RunStatus.PROC_RUN_SUCCESS; // } } catch (IOException e) { LOG.error("Run the Command Exception: " + cmd + ": " + e.getMessage()); resultMsg.append("Run the Command Exception: " + cmd + ": " + e.getMessage() + "\n"); isOK = RunStatus.EXPORT_FAIL; } finally { if (null != input) { input.close(); } if (null != isr) { isr.close(); } if (null != ps) { ps.destroy(); ps = null; } } dataMap.put("export_status", isOK); dataMap.put("proc_log", resultMsg.toString()); // dataMap = packageResult(isOK, resultMsg.toString()); // 组装返回的消息 return dataMap; } /** * @Title: createExportShellParams * @Description: 组装参数 * @param msgId * @param dbSchema * @param dbUser * @param dbPassword * @param tableName * @param filePath * @param delimiter * @param exportLimit * @return String 返回类型 * @throws */ private String createExportShellParams(String dbSchema, String dbUser, String dbPassword, String tableName, String filePath, String delimiter, String exportLimit) { StringBuilder params = new StringBuilder(); params.append(dbSchema + " ").append(dbUser + " ").append(dbPassword + " ") .append(tableName + " ").append(filePath + " ").append(delimiter + " ").append(exportLimit); return params.toString(); } /** * @Title: mkDirectory * @Description: 根据配置的路径和文件名,判断文件路径是否存在,若不存在,则先创建,拼接导出文件绝对路径。 * @param filePath * @param interFile * @return 对方法的参数进行描述 * @return String 返回类型 * @throws */ private String mkDirectory(StringBuffer filePath, String interFile) { File file = new File(filePath.toString()); if ( file.isDirectory() ) { if (filePath.toString().endsWith("/")) { filePath.append(interFile); } else { filePath.append("/").append(interFile); } } else { LOG.info("The file path is not exists, need to be created now. "); file.mkdir(); if (filePath.toString().endsWith("/")) { filePath.append(interFile); } else { filePath.append("/").append(interFile); } } return filePath.toString(); } /** 返回消息组装结果 */ private HashMap<String, String> packageResult(String isOK, String resultMsg) { HashMap<String, String> hsmap = new HashMap<String, String>(); hsmap.put(MapKeys.PROC_STATUS, isOK); hsmap.put(MapKeys.PROC_LOG, resultMsg); return hsmap; } }
传入的执行参数放入一个Map(HashMap<String, String> dataMap)中:
/** EXPORT TEST */ map.put("db_schema", "md"); map.put("db_user", "root"); map.put("db_password", "root"); map.put("table_name", "inter_log"); map.put("inter_file", "inter_log_20140915.avl"); map.put("delimiter", "|"); map.put("export_limit", "");
代码执行之后,将执行日志以及执行结果也存入该Map中一起返回:
dataMap.put("export_status", isOK); dataMap.put("proc_log", resultMsg.toString()); return dataMap;
执行结果界面: