前阵子工作中遇到一个问题,用java执行一个存取过程,花费时间很长(以前的项目,貌似业务操作只能在存取过程中执行),在执行的过程中因为执行时间过长,进程会执行一半就中断了,确认了不是java数据库连接池自动中断,我在本地模拟存取过程(在mysql中休眠),发现不会中断,查看mysql超时参数设置也是大于执行时长的。就不会出现中断操作(感觉还是服务器上的mysql参数设置问题,查看参数又是大于执行时长的),此时我手动kill掉进程,问题就重现了,最后结论,mysql那边的问题,但是参数又不能轻易改,在服务器终端执行不会超时,最后打算用python在服务器调用终端连接mysql,果然没出现中断了。
之前没有java调用外部脚本的经历,所以记录下
有时候我们可能需要调用系统外部的某个程序,此时就可以用Runtime.getRuntime().exec()来调用,他会生成一个新的进程去运行调用的程序。
此方法返回一个java.lang.Process对象,该对象可以得到之前开启的进程的运行结果,还可以操作进程的输入输出流。
Process对象有以下几个方法:
1、destroy() 杀死这个子进程
2、exitValue() 得到进程运行结束后的返回状态
3、waitFor() 得到进程运行结束后的返回状态,如果进程未运行完毕则等待知道执行完毕
4、getInputStream() 得到进程的标准输出信息流
5、getErrorStream() 得到进程的错误输出信息流
6、getOutputStream() 得到进程的输入流
因为脚本比较简单,所以写了个简单的工具类
path:脚本路径
param:运行脚本的参数
public static void runShell(String path,String param){
try {
Process ps = Runtime.getRuntime().exec(path+" "+param);
ps.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
String result = sb.toString();
logger.info(result);
}
catch (Exception e) {
e.printStackTrace();
}
}
Runtime.getRuntime().exec()能够执行JVM之外的程序,包括python、shell、等。。。。