java调用脚本

来源:互联网 发布:手机八字排盘命理软件 编辑:程序博客网 时间:2024/06/08 12:00

在Java 中如何调用各种脚本(shell,perl,python...)? 我们肯定会想到使用 Runtime.getRuntime().exec(cmd). 不过实际中根据需求会有更多更复杂的处理。 当有很多的脚本需要任务调度, 现在粗略给出一种解决办法 。
1. 开启一个服务端(单独的线程)专门来接受脚本

Java代码  收藏代码
  1. public class ScriptRunnerService {  
  2.     private static int port = 4444;  
  3.     public static void main(String[] args) {  
  4.         ScriptRunnerService srs = new ScriptRunnerService();  
  5.         String hostIp = args[0];  
  6.         String hostPort =  args[1];  
  7.         srs.go(hostIp, hostPort);  
  8.     }  
  9.   
  10.     public void go(String hostIp, String hostPort) {  
  11.         try {  
  12.             ServerSocket listener = new ServerSocket(Integer.valueOf(hostPort), 0, InetAddress.getByName(hostIp));  
  13.             Socket clientSocket;  
  14.             while (true) {  
  15.                 clientSocket = listener.accept();  
  16.                 Thread t = new Thread(new ServiceRunner(clientSocket));  
  17.                 t.start();  
  18.             }  
  19.         } catch (IOException ioe) {  
  20.             System.out.println("IOException on socket listen: " + ioe);  
  21.         } finally {  
  22.         }  
  23.     }  
  24.     class ServiceRunner implements Runnable {  
  25.         private Socket clientSocket;  
  26.         ServiceRunner(Socket clientSocket) {  
  27.             this.clientSocket = clientSocket;  
  28.         }  
  29.         @Override  
  30.         public void run() {  
  31.             int result = 1;  
  32.             String line;  
  33.             StringBuilder command = new StringBuilder();  
  34.             BufferedReader br = null;  
  35.             BufferedWriter bw = null;  
  36.             try {  
  37.                 System.out.print("command receiving...");  
  38.                 br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));  
  39.                 if ((line = br.readLine()) != null) {  
  40.                     command.append(line);  
  41.                 }  
  42.                 bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));  
  43.                 System.out.println(command);  
  44.                 Process p = Runtime.getRuntime().exec(command.toString());  
  45.                 result = p.waitFor();  
  46.                p.destroy();  
  47.                 write(bw, command.toString() + "\r\n");  
  48.             } catch (InterruptedException ie) {  
  49.                 write(bw, ie.getMessage() + "\r\n");  
  50.             } catch (IOException ioe) {  
  51.                 write(bw, ioe.getMessage() + "\r\n");  
  52.             } finally {  
  53.                 write(bw, "..Result.." + result + "\r\n");  
  54.                 write(bw, "..Command.." + command.toString() + "\r\n");  
  55.                 write(bw, "Host...." + clientSocket.getInetAddress().getHostAddress() + "\r\n");  
  56.                 try {  
  57.                     clientSocket.close();  
  58.                 } catch (IOException ioe) {  
  59.                     ioe.printStackTrace();  
  60.                 }  
  61.                 System.out.println("\t\tcommand finished with result: " + result);  
  62.             }  
  63.         }  
  64.     }  
  65.     private void write(BufferedWriter bw, String msg) {  
  66.         try {  
  67.             bw.write(msg);  
  68.             bw.flush();  
  69.         } catch (IOException ioe) {  
  70.             ioe.printStackTrace();  
  71.         }  
  72.     }  
  73. }  

 

Java代码  收藏代码
  1.  public class AppInitializer{  
  2.    public void  execScriptService(){  
  3.     String[] envParams = {"java -cp";, completeClasspath,   ScriptRunnerService.class.getName(),“127.0.0.1”,“4445”};  
  4.         ScriptRunnerService       scriptRunnerProcess = Runtime.getRuntime().exec(envParams);  
  5. }  
 

 

2. 客户端专门接受服务端的返回消息

 

Java代码  收藏代码
  1. public class SocketTransport {  
  2.     protected Logger log = new Logger(SocketTransport.class.getName());  
  3.     public String query(String host, int port, String queryString) throws IOException {  
  4.         String line;  
  5.         BufferedReader rd = null;  
  6.         BufferedWriter wr = null;  
  7.         Socket serverSocket = null;  
  8.         StringBuilder response = new StringBuilder();  
  9.         try {  
  10.             serverSocket = new Socket(InetAddress.getByName(host), port);  
  11.             wr = new BufferedWriter(new OutputStreamWriter(serverSocket.getOutputStream(), "UTF8"));  
  12.             log.warn("sending request: %s to %s:%s ", queryString, host, port);  
  13.             wr.write(queryString + "\r\n");  
  14.             wr.flush();  
  15.             rd = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));  
  16.             while ((line = rd.readLine()) != null) {  
  17.                 response.append(line);  
  18.             }  
  19.         } catch (UnknownHostException e) {  
  20.             log.error(e);  
  21.             throw new IOException(e);  
  22.         } finally {  
  23.             IOUtils.closeQuietly(wr);  
  24.             IOUtils.closeQuietly(rd);  
  25.             if (serverSocket != null) {  
  26.                 serverSocket.close();  
  27.             }  
  28.         }  
  29.         log.warn("finish request: ", queryString);  
  30.         return response.toString();  
  31.     }  
  32. }  

 

3.  执行脚本

 

Java代码  收藏代码
  1. public class ScriptTest {  
  2.     public static void execute(String path , String script, String param) throws IOException, InterruptedException{  
  3.        if(...){  
  4.   
  5.         SocketTransport st = new SocketTransport();  
  6.         String msg = st.query("127.0.0.1", 4445, "java -version");  
  7.         System.out.println(msg);  
  8.      else{  
  9.   
  10.           Process p = Runtime.getRuntime().exec(path + script + params);  
  11.             System.out.println("Executing for "+type+": " + path + script + params);  
  12.             p.waitFor();  
  13.             p.destroy();  
  14.           }          
  15.     }  
  16.       
  17. }  
0 0