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;

  

  执行结果界面:

时间: 2024-10-22 10:56:58

Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件的相关文章

Shell脚本实现DB2数据库表导出到文件

该Shell脚本用于实现将DB2数据库表导出到文件,将在另一篇博文<Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件>中通过Java代码实现调用该脚本并传入参数. 1 #!/usr/bin/env sh 2 3 DBSCHEMA=$1 4 DBUSER=$2 5 DBPASSWORD=$3 6 TABLENAME=$4 7 FILEPATH=$5 8 DELIMITER=$6 9 EXPORTLIMIT=$7 10 11 SQLERR="NO ERROR MSG&

[Python]在python中调用shell脚本,并传入参数-02python操作shell实例

首先创建2个shell脚本文件,测试用. test_shell_no_para.sh 运行时,不需要传递参数 test_shell_2_para.sh 运行时,需要传递2个参数  test_shell_no_para.sh 内容如下:  test_shell_2_para.sh内容如下 注意含有变量的字符串要用 双引号 括起来 直接在命令行运行 test_shell_2_para.sh 执行结果如下: [email protected]348-G4:~$ sh test_shell_2_para

java调用shell脚本且传递参数

在最近的工作中,需要用到Java要调用shell脚本的情况.总结如下: @RequestMapping("/changePermission") public String changePermission(){ String returnCode = ""; try { Process process = Runtime.getRuntime().exec("chmod 755 /tmp/upgrade.sh"); process.waitFo

Java如何调用shell脚本的

有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的.这种时候就需要Java对脚本调用的支持了. 测试环境 Ubuntu16.04 i3-6100,12GB Hello World 来看一个基本的例子 Process exec = Runtime.getRuntime().exec(new String[] { "uname" ,"-a"}); exec.waitFor(); BufferedReader reader

利用jmeter发起java请求调用shell脚本

1.创建maven项目 在pom文件中加入依赖: 2.在路径src/main/java下创建类,如类名shellclass 3.      创建jmeter调用类,如jmtershell,完成jmetershell编写后导出成jar包. 3.     将shelljmeter.jar放入jmeter安装路径\lib\ext目录下:将依赖的maven包ganymed-ssh2-210-huson-1.jar放入jmeter安装路径\lib路径下. 4.         在jmeter中创建java

《懒人Shell脚本》之八——定期备份Mysql数据库表的实现

0.背景 实际开发环境中,前端程序需要在给定时间段内,将数据更新/插入到mysql指定的库表中.随着数据量的增多,基础库表基数的增长,每更新一次都会有5s左右的卡顿. 改进方案一:批量更新,累计数10条或者100条进行一次更新入库操作: 改进方案二:将当前日期前1个月之前的数据进行备份操作,并删除当前库表中1个月前的数据.经测定,该方法一定程度提高了访问效率.根因:基础表基数少,查询效率相对提高. 1.库表的定时备份总结 步骤1:备份Mysql指定数据库中的制定库表. 使用 mysqldump,

Java 调用 shell 脚本详解

这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的"陷阱"造成调用shell 脚本在某些特殊的场景下,有一些奇奇怪怪的bug. 大家且听我一一道来. 先看看网上搜索到的例子: [java] view plain copy package someTest; import java.io.BufferedReader; import java.io.IOException; im

Java调用 shell脚本阻塞

Java在调用Shell时,要不断读取进程中标准输出和错误输出流的信息,否则缓冲区被写满就会造成子进程阻塞而无法继续运行下去,可起两个线程不断读取标准输出.错误流信息而不被阻塞 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingExcept

java代码调用数据库存储过程

由于前边有写java代码调用数据库,感觉应该把java调用存储过程也写一下,所以笔者补充该篇! package testSpring; import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet; import oracle.jdbc.OracleCalla