Java8 更新了JavaScript引擎,从Mozilla Rhino,改为使用nashorn,下面是一个实例。
近期部门要开发一款设备的测试工具,测试的流程比较复杂且不固定,如果在Java代码中写出固定流程的话就不够灵活。所以决定用JS脚本来描述流程,用Java实现具体的业务功能。Java解析JS的引擎自然使用最新的nashorn,下面贴出代码。
Java调用JS脚本的代码:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
public class JSTesterCallFunctions {
public static void main(String[] args){
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
try{
for(int i = 0; i < args.length; i++){
File file = new File(args[i]).getAbsoluteFile();
System.out.println("args[" +i+ "] is" + file);
if(file.isFile()){
String strJSName = args[i];// For Jar
nashorn.eval(new FileReader(strJSName ));
Object eval = nashorn.eval("make('" + strJSName + "')");// 传递参数strJSName到JS脚本
else{
System.out.println("Java运行命令参数非法,请检查!");
}
}
} catch (ScriptException | FileNotFoundException e) {
System.out.println("Error executing script: " + e.getMessage());
}
}
}
上面的Java代码是程序启动的主程序,可以main函数的参数args[]传入JS脚本的名字,而且可以传入多个JS脚本,逐一执行。
在调用JS脚本中的make函数时,将JS脚本的名字作为参数传入,方便在后面的代码中,根据不同的JS脚本分别产生日志文件。即每个JS脚本可以对应一个日志文件,方便查看。
JS脚本内容:
function make(JSName) {
//Java代码中定义的,用来建立SOCKET连接的类
var KMT2KMS = Java.type("com.kmt.functions.KMTConnectToKMS");
// Java ArrayList类型定义
var ArrayList = Java.type("java.util.ArrayList");
/**
* Server信息
*/
var serverIP = "10.88.104.44";
var serverPort = 8007;
var keySizeReportTimer = 5000;
//定义设备数量
var kmtNum = 3;
var kmts = new Array(kmtNum);
for(var i=0; i<kmtNum; i++){
//每个kmt应该有不同的名字,再for后面的离网时,通过对象名调用离网
kmts[i] = new KMT2KMS(JSName, serverIP, serverPort);
kmts[i].sslConnection();//kmt的对象,调用kmt的成员函数
}
//在JS脚本中如何使用Java ArrayList类型
for(var i=0; i<kmtNum; i++){
//定义Java的ArrayList,
var keyPairSizeList = new ArrayList();
keyPairSize = kmtNum;
for(var j=0; j<keyPairSize; j++){
var keySizeTargetId = startId + j;
if(kmts[i].startId == keySizeTargetId){//如果keySizeTargetId与本KMT startId相等,则跳过继续
continue;
}
var sendKey = 100;
var recKey = 100;
var keySizeInfo = new KeySizeInfo(keySizeTargetId, sendKey, recKey);
keyPairSizeList.add(keySizeInfo)
}
//在keySizeReportTimer时间后,执行该函数,在java代码中sleep对应时间
kmts[i].keySizeReport(keySizeReportTimer, keyPairSizeList);
}
/**
* 设备离网
*/
for(var k=0; k<kmtNum; k++){
kmts[k].kmtDisconnectKMS(3000);
}
}
在JS代码中可以定义Java类的对象,然后通过对象调用对应的函数。测试流程可以在JS中灵活描述,方便工具后期的使用。
刚开始用也不是很熟悉,欢迎大家点评: )
项目组其他同事使用MQ比较多,也是一款开源的JS脚步调用Java程序的工具,感兴趣可以研究一下。
对了,关于根据JS文件名记录到不同的日志文件,后期会在Log4j2的内容中总结,当然Log4j1也可以做到这一点。