最近项目需要用到配置表达式,然后后台解析表达式并运行得到结果,类似这种"true||true"表达式,java里自带的不支持这种,只能用java里的ScriptEngine的js引擎来执行,但是效率太慢了,跑个400万数据要几十天,太慢了,后来优化了一下也要4天,虽然快了10倍左右,但还是达不到项目要求。
String expression="true||true";
ScriptEngine s = new ScriptEngineManager().getEngineByName("js");
isPassFlag = (boolean) s.eval(expression);//运行表达式得到值
看了看代码也实在看不出哪里还可以优化了,想想只能换个能运行表达式的类库或者jar包,果然找到了其他的一些,如
IKExpression和Apache 的Jakarta Commons Jexl,前者因为在maven工程里找不到jar包,我先试了下后面的jexl,感觉速度和js引擎来执行 表达式速度没快多少。 JexlContext jexlContext = JexlHelper.createContext(); Expression expression1 = ExpressionFactory.createExpression(expression); isPassFlag = (boolean) expression1.evaluate(jexlContext); 只能忍着用导入本地jar包的方式把IKExpression导入到工程,试了下速度,400万大概8小时,比js的快10多倍。 这下可以了,哈哈 isPassFlag = (boolean) ExpressionEvaluator.evaluate(expression); pom.xml中加入: <dependency> <groupId>org.wltea.expression</groupId> <artifactId>IKExpression</artifactId> <version>2.1.2s</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/IKExpression2.1.2.jar</systemPath> </dependency> ikexpression下载:https://code.google.com/archive/p/ik-expression/downloads 官网:https://code.google.com/archive/p/ik-expression/