本帖最后由 MEI 于 2014-10-30 16:44 编辑
本文通过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;
复制代码
执行结果界面: |