- 浏览: 129887 次
- 性别:
- 来自: 苏州
文章分类
最新评论
在Java 中如何调用各种脚本(shell,perl,python...)? 我们肯定会想到使用 Runtime.getRuntime().exec(cmd). 不过实际中根据需求会有更多更复杂的处理。 当有很多的脚本需要任务调度, 现在粗略给出一种解决办法 。
1. 开启一个服务端(单独的线程)专门来接受脚本
public class ScriptRunnerService { private static int port = 4444; public static void main(String[] args) { ScriptRunnerService srs = new ScriptRunnerService(); String hostIp = args[0]; String hostPort = args[1]; srs.go(hostIp, hostPort); } public void go(String hostIp, String hostPort) { try { ServerSocket listener = new ServerSocket(Integer.valueOf(hostPort), 0, InetAddress.getByName(hostIp)); Socket clientSocket; while (true) { clientSocket = listener.accept(); Thread t = new Thread(new ServiceRunner(clientSocket)); t.start(); } } catch (IOException ioe) { System.out.println("IOException on socket listen: " + ioe); } finally { } } class ServiceRunner implements Runnable { private Socket clientSocket; ServiceRunner(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { int result = 1; String line; StringBuilder command = new StringBuilder(); BufferedReader br = null; BufferedWriter bw = null; try { System.out.print("command receiving..."); br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); if ((line = br.readLine()) != null) { command.append(line); } bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); System.out.println(command); Process p = Runtime.getRuntime().exec(command.toString()); result = p.waitFor(); p.destroy(); write(bw, command.toString() + "\r\n"); } catch (InterruptedException ie) { write(bw, ie.getMessage() + "\r\n"); } catch (IOException ioe) { write(bw, ioe.getMessage() + "\r\n"); } finally { write(bw, "..Result.." + result + "\r\n"); write(bw, "..Command.." + command.toString() + "\r\n"); write(bw, "Host...." + clientSocket.getInetAddress().getHostAddress() + "\r\n"); try { clientSocket.close(); } catch (IOException ioe) { ioe.printStackTrace(); } System.out.println("\t\tcommand finished with result: " + result); } } } private void write(BufferedWriter bw, String msg) { try { bw.write(msg); bw.flush(); } catch (IOException ioe) { ioe.printStackTrace(); } } }
public class AppInitializer{ public void execScriptService(){ String[] envParams = {"java -cp";, completeClasspath, ScriptRunnerService.class.getName(),“127.0.0.1”,“4445”}; ScriptRunnerService scriptRunnerProcess = Runtime.getRuntime().exec(envParams); }
2. 客户端专门接受服务端的返回消息
public class SocketTransport { protected Logger log = new Logger(SocketTransport.class.getName()); public String query(String host, int port, String queryString) throws IOException { String line; BufferedReader rd = null; BufferedWriter wr = null; Socket serverSocket = null; StringBuilder response = new StringBuilder(); try { serverSocket = new Socket(InetAddress.getByName(host), port); wr = new BufferedWriter(new OutputStreamWriter(serverSocket.getOutputStream(), "UTF8")); log.warn("sending request: %s to %s:%s ", queryString, host, port); wr.write(queryString + "\r\n"); wr.flush(); rd = new BufferedReader(new InputStreamReader(serverSocket.getInputStream())); while ((line = rd.readLine()) != null) { response.append(line); } } catch (UnknownHostException e) { log.error(e); throw new IOException(e); } finally { IOUtils.closeQuietly(wr); IOUtils.closeQuietly(rd); if (serverSocket != null) { serverSocket.close(); } } log.warn("finish request: ", queryString); return response.toString(); } }
3. 执行脚本
public class ScriptTest { public static void execute(String path , String script, String param) throws IOException, InterruptedException{ if(...){ SocketTransport st = new SocketTransport(); String msg = st.query("127.0.0.1", 4445, "java -version"); System.out.println(msg); else{ Process p = Runtime.getRuntime().exec(path + script + params); System.out.println("Executing for "+type+": " + path + script + params); p.waitFor(); p.destroy(); } } }
发表评论
-
几种任务调度的 Java 实现方法与比较
2014-12-05 16:16 594几种任务调度的 Java 实现方法与比较 http:// ... -
Jibx
2013-03-11 10:25 1264A. Java To Xml 1. Generate ... -
常用的正则表达式(转)
2013-02-06 11:16 1227“^d+$” //非负整 ... -
solr 开发文档
2013-01-04 13:12 0http://www.cnblogs.com/hoojo/ar ... -
理解ThreadLocal(转)
2011-09-02 15:03 903ThreadLocal是什么 早在JD ... -
Java关键字transient和volatile小结(转)
2011-08-29 17:26 20182transient和volatile两个关 ... -
REST与SOAP样式Web 服务的区别(转)
2011-07-25 11:25 1096基本原理层次上说,REST 样式和 SOAP ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用(转)
2011-04-11 10:51 1954从 Java 5 开始,Java 提供了自己的线程池。线程 ... -
使用 JunC++ion 创建JNI
2009-07-21 16:31 1545在java中创建jni,都是通过一些命令,创建一些 ... -
HttpURLConnection使用
2009-06-22 17:15 3355HttpURLConnection是基于HTTP协议的,其底层 ... -
利用httpclient访问受保护的资源地址
2009-06-22 17:00 1344模拟登录 1、session方式 import java.io ... -
常见算法程序实现集合(C,Java)
2008-12-22 15:16 1059常見程式演算」主要收集一些常見的程式練習題目,您可以藉這些題目 ... -
在 Windows 中实现 Java 本地方法
2008-12-10 14:26 1508WebSphere Development Research ... -
N!的全排列算法(Java实现)
2008-09-16 16:20 2573public class TestSort { Str ... -
JDK1.5新特性(转载)
2008-02-27 14:13 2839"JDK1.5"的一个重要主题就是通过新增 ... -
采用ASM动态生成set和get方法
2007-12-18 16:13 4067ASM 功能强大,采用指令操纵class文件,可以生成你所需的 ... -
Java的ClassLoader与Package机制(转载)
2007-07-01 21:41 1244为了深入了解Java的ClassLoader机制,我们先来做以 ...
相关推荐
自己写的几个调用百度地图API的实用性方法 HTML和JS代码都有
Java与Java Script交叉调用技术在Web开发中的应用
lotus domino lotusscript调用java
java 通过jna调用c++ 推理方法 用c++ 做pytorch torch script 推理
通过DWR实现在HTML和Java Script中直接调用服务端的Java Bean
Java执行和调用JavaScript脚本文件的示例,使用Java调用JavaScript文件并输入结果。
webseservice 客户端调用,java发布的axis2 webservice,通过 js调用调用webservice,普通ajax实现,里面有详细注释,代码简单明了,我自己做过测试。希望对大家有所帮助。
javax.script java调用js的jar包
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
为了在 JavaScript 中访问原生类型或者引用 Java 类型,可以调用 Java.type() 函数,该函数根据传入的完整类名返回对应对象的类型。下面代码显示如何获取不同的对象类型: var ArrayList = Java.type("java.util....
摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...
摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
JAVA开发人员必备!本文档是 Java Platform Standard Edition 6 的 API !Java 1.6 API的中文帮助文档。 深圳电信培训中心徐海蛟博士教学用api中文文档。支持全文检索,在线即时查询。 里面列出了,Java的所有类...