本文通过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;

  

  执行结果界面:

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

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

    该Shell脚本用于实现将DB2数据库表导出到文件,将在另一篇博文<Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件>中通过Java代码实现调用该脚本并传入参数. #! ...

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

    首先创建2个shell脚本文件,测试用. test_shell_no_para.sh 运行时,不需要传递参数 test_shell_2_para.sh 运行时,需要传递2个参数  test_shell ...

  3. 用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql

    1:创建shell脚本 touch sqoop_options.sh chmod 777 sqoop_options.sh 编辑文件  特地将执行map的个数设置为变量  测试 可以java代码传参数 ...

  4. Java如何调用shell脚本的

    有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的.这种时候就需要Java对脚本调用的支持了. 测试环境 Ubuntu16.04 i3-6100,12G ...

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

    1.创建maven项目 在pom文件中加入依赖:     2.在路径src/main/java下创建类,如类名shellclass                     3.      创建jmet ...

  6. 向shell脚本中传入参数

    写一个 程序名为    test.sh    可带参数为 start 和 stop 执行  test.sh start执行  start 内容的代码 执行 test.sh stop 执行 stop 内 ...

  7. shell脚本获取传入参数的个数

    ts.sh #!/bin/bash echo $# 输出 [root@redhat6 ~]# ./ts.sh para1 [root@redhat6 ~]# ./ts.sh para1 para2 [ ...

  8. Java 调用 shell 脚本详解

    这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的“陷阱”造成调用shell 脚本在某些特 ...

  9. python调用shell脚本时需要切换目录

    最近遇到了一个问题,就是python代码调用shell脚本时,发现输入输出的文件,总是和自己预想的有偏差,但是单独在linux下执行命令的时候,却没有错误.后来发现是相对路径的问题,因为执行pytho ...

随机推荐

  1. SuperSocket接收过滤器工厂(ReceiveFilterFactory)

    接收过滤器工厂(ReceiveFilterFactory)用于为每个会话创建接收过滤器. 定义一个过滤器工厂(ReceiveFilterFactory)类型, 你必须实现接口 IReceiveFilt ...

  2. 2013-10-6 datagridview实现换行并自动设置行高

    datagridview设置换行,如下,文本设置\r\n即可换行 dv4.DefaultCellStyle.WrapMode = DataGridViewTriState.True; dv4.Auto ...

  3. HTML让文字在图片上显示的几种方法

    第一种方式是image 作为背景图片,即:background:url("......."); 第二种方式是将img块与文字块(文字块采用span标签显示)放在同一个div 中,然 ...

  4. Java中方法的格式

    [修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……]) {             执行语句;     [return 返回值;]//需要的话 } 参数列表(参数的类型 ...

  5. java 创建线程方式

    1.继承Thread类 子类覆写父类中的run方法,将线程运行的代码存放在run中. 建立子类对象的同时线程也被创建. 通过调用start方法开启线程. 2.实现Runnable接口 子类覆盖接口中的 ...

  6. Python--day43--连表查询(重要)

  7. ubuntu snmp 安装与配置

    0.说明 关于一个完整的教程,还是那句话,国内的要么不完整,要么就太旧了,而且思路也不清晰,所以这里写一篇完整的给大家分享一下. 虽然对于Linux主机的监控可以通过执行特定的命令来完成,但是相比之后 ...

  8. linux版本依赖

    记住, 你的模块代码一定要为每个它要连接的内核版本重新编译 -- 至少, 在缺乏 modversions 时, 这里不涉及因为它们更多的是给内核发布制作者, 而不是开发者. 模块 是紧密结合到一个特殊 ...

  9. UVA - 10480 Sabotage (Dinic)

    The regime of a small but wealthy dictatorship has been abruptly overthrown by an unexpected rebel-l ...

  10. 使用FluentEmail发送outlook邮件

    一,邮箱账号相关设置 1,创建outLook邮箱. 2,进入邮箱设置->同步电子邮件->允许设备和应用使用pop 3,设置microsoft账号的应用程序密码->进入安全性页面-&g ...