`

Java如何调用script

    博客分类:
  • JAVA
 
阅读更多

在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 script)

    自己写的几个调用百度地图API的实用性方法 HTML和JS代码都有

    Java与Java Script交叉调用技术在Web开发中的应用.pdf

    Java与Java Script交叉调用技术在Web开发中的应用

    lotus domino lotusscript调用java

    lotus domino lotusscript调用java

    java jna 调用pytorch c++模型推理

    java 通过jna调用c++ 推理方法 用c++ 做pytorch torch script 推理

    通过DWR实现在HTML和Java Script中直接调用服务端的Java Bean

    通过DWR实现在HTML和Java Script中直接调用服务端的Java Bean

    java_run_js.rar_run_run java script

    Java执行和调用JavaScript脚本文件的示例,使用Java调用JavaScript文件并输入结果。

    java webservice axis2 通过 js javascript 调用webservice

    webseservice 客户端调用,java发布的axis2 webservice,通过 js调用调用webservice,普通ajax实现,里面有详细注释,代码简单明了,我自己做过测试。希望对大家有所帮助。

    javax.script

    javax.script java调用js的jar包

    java开源包1

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    在JavaScript中调用Java类和接口的方法

    为了在 JavaScript 中访问原生类型或者引用 Java 类型,可以调用 Java.type() 函数,该函数根据传入的完整类名返回对应对象的类型。下面代码显示如何获取不同的对象类型: var ArrayList = Java.type("java.util....

    JAVA上百实例源码以及开源项目源代码

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...

    JAVA上百实例源码以及开源项目

    摘要:Java源码,初学实例,EJB调用实例  各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,...

    java开源包4

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    java开源包101

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    java开源包11

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    java开源包6

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    java开源包9

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    Java 1.6 API 中文 New

    JAVA开发人员必备!本文档是 Java Platform Standard Edition 6 的 API !Java 1.6 API的中文帮助文档。 深圳电信培训中心徐海蛟博士教学用api中文文档。支持全文检索,在线即时查询。 里面列出了,Java的所有类...

Global site tag (gtag.js) - Google Analytics