java调用python或者shell脚本

         前阵子工作中遇到一个问题,用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、等。。。。

 

 

 

 

你可能感兴趣的:(学习记录)