zoukankan      html  css  js  c++  java
  • Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

      本文通过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 + "
    ");
             
            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 +  "
    ");
                 
                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() + "
    ");
                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;
    

      

      执行结果界面:

    wKioL1QYCYfzuZzpAAIgt-iNz48024.jpg

    博客地址: http://www.cnblogs.com/dwf07223,本文以学习、研究和分享为主,欢迎转载,转载请务必保留此出处。若本博文中有不妥或者错误处请不吝赐教。

  • 相关阅读:
    canvas
    学习总结
    后台管理人员项目,添加和查询的思路
    写了项目的一些心得
    学了一丢丢的正则皮毛
    已学的前端存储(学生)
    $.ajax()方法详解即自己遇到问题(新手)
    C#中 decimal 的四舍五入
    自己写一个C#数据结构:用List<T>实现一个简单的Stack
    【转】在CentOS 6.X上部署C# 开发环境
  • 原文地址:https://www.cnblogs.com/dwf07223/p/3991670.html
Copyright © 2011-2022 走看看