- 浏览: 133398 次
- 性别:
- 来自: 苏州
文章分类
最新评论
在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 695几种任务调度的 Java 实现方法与比较 http:// ... -
Jibx
2013-03-11 10:25 1370A. Java To Xml 1. Generate ... -
常用的正则表达式(转)
2013-02-06 11:16 1330“^d+$” //非负整 ... -
solr 开发文档
2013-01-04 13:12 0http://www.cnblogs.com/hoojo/ar ... -
理解ThreadLocal(转)
2011-09-02 15:03 970ThreadLocal是什么 早在JD ... -
Java关键字transient和volatile小结(转)
2011-08-29 17:26 20261transient和volatile两个关 ... -
REST与SOAP样式Web 服务的区别(转)
2011-07-25 11:25 1177基本原理层次上说,REST 样式和 SOAP ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用(转)
2011-04-11 10:51 1992从 Java 5 开始,Java 提供了自己的线程池。线程 ... -
使用 JunC++ion 创建JNI
2009-07-21 16:31 1585在java中创建jni,都是通过一些命令,创建一些 ... -
HttpURLConnection使用
2009-06-22 17:15 3396HttpURLConnection是基于HTTP协议的,其底层 ... -
利用httpclient访问受保护的资源地址
2009-06-22 17:00 1387模拟登录 1、session方式 import java.io ... -
常见算法程序实现集合(C,Java)
2008-12-22 15:16 1170常見程式演算」主要收集一些常見的程式練習題目,您可以藉這些題目 ... -
在 Windows 中实现 Java 本地方法
2008-12-10 14:26 1570WebSphere Development Research ... -
N!的全排列算法(Java实现)
2008-09-16 16:20 2614public class TestSort { Str ... -
JDK1.5新特性(转载)
2008-02-27 14:13 2891"JDK1.5"的一个重要主题就是通过新增 ... -
采用ASM动态生成set和get方法
2007-12-18 16:13 4118ASM 功能强大,采用指令操纵class文件,可以生成你所需的 ... -
Java的ClassLoader与Package机制(转载)
2007-07-01 21:41 1292为了深入了解Java的ClassLoader机制,我们先来做以 ...
相关推荐
总结来说,Java调用IE内核主要涉及Java与ActiveX控件的交互,这一技术虽然有一定的历史背景,但在现代Web开发中已经较少使用,更多的现代解决方案倾向于使用标准Web技术或者基于Chromium的框架。理解和学习这个知识...
本文将深入探讨“Java调用JavaScript代码”的技术实现,以及它在实际项目中的应用场景。 Java和JavaScript虽然名字相似,但它们是两种完全不同的编程语言,各自有其特定的用途。Java是一种静态类型的、面向对象的...
在IT行业中,数据库...总之,Java调用SQL*Plus执行定制的SQL脚本是数据库自动化的一个重要手段,通过选择合适的方式,可以大大提高工作效率,减少人为错误。理解并熟练掌握这一技巧,对提升你的IT专业技能大有裨益。
"java调用js方法.doc"很可能是详细描述如何从Java调用JS函数的步骤和示例。 在实际应用中,Java代码可能会通过Ajax发送一个请求到服务器,服务器解析请求后调用对应的JS函数,例如在"des.js"中执行解密操作,然后将...
本示例探讨了如何使用Java调用Python脚本,实现数据交换和处理。Java和Python结合使用,可以充分利用Java的高效性能和Python的易用性及丰富的库资源。 Java调用Python主要依赖于Jython、Apache Beam、Java的Runtime...
Java JNA调用PyTorch C++模型推理是一种在Java应用程序中利用PyTorch的深度学习能力的方法。JNA(Java Native Access)是Java平台上的一个库,它允许Java代码直接调用本机库(如C++编写的库),而无需编写JNI(Java ...
在Java编程环境中,调用实体打印机来打印...总之,Java调用实体打印机打印PDF文件涉及到PDF处理库的使用、打印服务API的配置以及错误处理等多个环节。正确理解和运用这些知识点,可以帮助你构建一个可靠的PDF打印系统。
例如,"Java调用Python脚本"是一个常见的需求,特别是在数据处理、科学计算或机器学习等场景中,Python的强大库可以与Java的稳定性和企业级应用能力相结合。本教程将详细讲解如何在Java程序中调用Python脚本。 首先...
自己写的几个调用百度地图API的实用性方法 HTML和JS代码都有
例如,多线程和本地方法调用在JavaScript中通常是不可行的,因此Java2Script需要对这些情况进行特殊处理或者提供替代方案。此外,由于JavaScript的动态特性和Java的静态特性之间的差异,性能可能成为使用Java2Script...
Java调用Jython、JRuby和Groovy提供了强大的动态编程能力,使得开发者可以在Java应用中充分利用这些脚本语言的优点。了解如何在Java中正确地调用和管理这些脚本,对于提升开发效率和应用功能都有很大帮助。在实际...
首先,Kettle支持两种方式来调用Java类:使用“Java Class”步骤和使用“Execute Java Script”步骤。"Java Class"步骤允许直接执行一个预编译的Java类,而"Execute Java Script"步骤则用于运行Java Script...
Java调用Groovy是一种常见的技术,特别是在开发过程中需要动态脚本支持时。Groovy是一种基于JVM(Java Virtual Machine)的、动态类型的编程语言,它与Java有着良好的互操作性,能够无缝集成到Java项目中。这篇博客...
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如自动化运维、文件管理等,这时就可能需要用到调用Shell脚本。本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的...
这篇博客“java调用bat批处理与sh脚本”将详细讲解如何在Java程序中实现这一功能。 首先,我们要理解Java是如何与操作系统进行交互的。Java提供了`Runtime`类和`ProcessBuilder`类,这两个类都可以用来执行外部命令...
### Java调用JS代码实现动态配置 在现代软件开发中,动态配置的需求越来越普遍,特别是在不希望频繁重启服务的情况下更新业务逻辑或算法时。本文将详细介绍如何利用Java调用JavaScript来实现这一目标,并通过一个...
Java调用JavaScript 使用`addJavascriptInterface()`方法暴露一个Java对象给JavaScript环境,这样JavaScript就可以调用这个对象的方法: ```java webView.addJavascriptInterface(new Object() { @...
php调用java类的方法 需要将java工程打包称jar包之后调用
### Java Script脚本常用代码详解 #### 一、概述 JavaScript是一种广泛使用的脚本语言,尤其在网页开发中扮演着重要角色。对于初学者来说,掌握一些基础且常用的JavaScript代码片段是十分必要的。本文将根据提供的...
- `clearTimeout()`:取消由 `setTimeout()` 设置的延时调用。 - 示例:`clearTimeout(timeoutId);` - `clearInterval()`:取消由 `setInterval()` 设置的定时调用。 - 示例:`clearInterval(intervalId);` ###...