[今天通过crontab运行执行java程序的脚本时,java程序怎么都无法启动,但是在shell中执行时完全没有问题,同时通过crontab执行一般的脚本(比如仅有echo的脚本)可以成功运
对于非Web的后台服务程序,经常会碰到这样的需求:
动态改变程序运行时参数的能力。如Config.limitValue = 50
动态查看运行时候变量状态的能力,如 print(userMap.size())
执行代码的能力,如 userMap.clear()
对于需求1,非Web的程序没法像PHP/JSP那样直接改就生效,往往改了某个值,即使是一个配置参数都需要服务器重启一下。这对于很多线上服务来说成本太高。
对于上述2的需求,通常是编写庞大的后台管理程序来满足。或者是通过增加日志输出,但问题是某些变量只需要偶尔才看一下,因此很多系统中大部分日志开销基本上是无用的。
对于需求3,只有通过在IDE的debug模式下才能达到。
我觉得所有的后台程序都应该具备这样的能力,为了满足以上需求,于是考虑在所有程序里面嵌入一个小型的解释脚本引擎来实现。就像很多游戏程序嵌入Lua/Python来动态执行代码目的一样。
今天先说下Java中的实现方法,几年前用过BeanShell, 可以在Java VM里面解释执行多种类型脚本语言。但是发现已经多年不更新,原来是Java 6已经内建Scripting的支持,所以这些第三方的工具也都结束了历史使命。
Java 6自带的实际上是 Mozilla Rhino 的Java Script引擎,它使用JavaScript的语法,可以调用任意Java代码。更多介绍见Java Scripting Programmer’s Guide. Rhino除了import写法有点特殊外,基本语法和Java代码基本一致。如:
engine.eval("importClass(java.lang.System)");
engine.eval("println(System.currentTimeMillis())");
engine.eval("println('Source: http://timyang.net/java/java-scriptingjava-scripting/')");
于是做了一个简单的socket服务器,把发过来的文本直接执行,然后再把脚本执行产生的内容返回给发送方。目标达成。共40余行代码(包括注释和花括号),无需任何第三方library。代码如下:
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
while (true) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444, 50, InetAddress.getByName("localhost"));
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
String inputLine, outputLine;
while ((inputLine = in.readLine()) != null) {
if ("quit".equals(inputLine))
break;
try {
// evaluate JavaScript code from String
out.println(engine.eval(inputLine));
} catch (Exception e) {
out.println("error:" + e.getMessage());
}
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
启动程序之后只要 telnet localhost 4444 就可以执行任意代码并实时查看返回结果。
注意上面为了安全起见,只绑定了localhost地址,防止此功能被外部用户恶意使用。
不是太理解什么叫做在JAVA里面运行时 动态执行的能力哦????[import java.io.File;import java.lang.reflect.Field;import java.util.Arrays;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.S
 
                   
                   
                   
                   本文介绍了如何在Java程序中利用内置的Rhino JavaScript引擎,通过创建一个简单的socket服务器来实现实时接收并执行远程脚本请求。通过这种方法,可以动态地改变程序运行时参数,查看运行状态,并执行代码,而无需重启服务。示例代码展示了一个40余行的小型服务器,允许通过telnet连接执行JavaScript命令并获取结果,强调了这一功能的安全性和实用性。
本文介绍了如何在Java程序中利用内置的Rhino JavaScript引擎,通过创建一个简单的socket服务器来实现实时接收并执行远程脚本请求。通过这种方法,可以动态地改变程序运行时参数,查看运行状态,并执行代码,而无需重启服务。示例代码展示了一个40余行的小型服务器,允许通过telnet连接执行JavaScript命令并获取结果,强调了这一功能的安全性和实用性。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                  
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            