Java8新JavaScript引擎nashorn使用实例

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也可以做到这一点。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值