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 + "\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;

  

  执行结果界面:

wKioL1QYCYfzuZzpAAIgt-iNz48024.jpg

 

posted @ 2014-09-24 22:16  沉默的猿  阅读(2996)  评论(1编辑  收藏  举报
AmazingCounters.com
给我写信