Jakarta ee 多线程java应用程序中的javascript评估
我们使用Rhino引擎来评估javaEE应用程序中的javascript(我们使用javascript作为参数化,在DTO-s之间传递数据和条件参数化等)。 我们做了一些性能测试,结果很奇怪 javascript引擎非常慢。持续时间呈指数增长。 我想把整个引擎换成纳什隆,但在此之前,我试图改善我们现在的状况 关于我们使用它的方式的一些代码片段(可能问题在这里(?) 每次尝试对表达式求值时,我都会通过以下方式创建JavaScriptEval对象:Jakarta ee 多线程java应用程序中的javascript评估,jakarta-ee,rhino,Jakarta Ee,Rhino,我们使用Rhino引擎来评估javaEE应用程序中的javascript(我们使用javascript作为参数化,在DTO-s之间传递数据和条件参数化等)。 我们做了一些性能测试,结果很奇怪 javascript引擎非常慢。持续时间呈指数增长。 我想把整个引擎换成纳什隆,但在此之前,我试图改善我们现在的状况 关于我们使用它的方式的一些代码片段(可能问题在这里(?) 每次尝试对表达式求值时,我都会通过以下方式创建JavaScriptEval对象: public void init() {
public void init() {
Context cc = Context.getCurrentContext();
if ( cc == null) {
cc = Context.enter();
}
this.ctx = cc;
this.scope =this.ctx.initStandardObjects(null);
this.wrapFactory = new WrapFactory();
}
之后,我们将对象(例如DTO-s)添加到范围中
private void putObject(String id, Object obj) {
Context ctx = setupContext();
if (obj != null) {
Scriptable paramWrapper = this.wrapFactory.wrapAsJavaObject(/*this.ctx*/ ctx, this.scope, obj, obj.getClass());
this.scope.put(id, this.scope, paramWrapper);
}
}
之后,我们用以下方法计算表达式:
public Object eval(Object scriptId, String source){
Object ret;
ret = ctx.evaluateString(this.scope,source, scriptId.toString(), 1, null);
return ret;
}
我试着使用某种缓存。我使用了compileString方法,然后将其放入缓存中。但是这样的内存使用率非常高
之后,我尝试限制放入缓存中的javascript源代码的长度。但问题是,随着并发使用率的增加,性能也变得不稳定
有什么想法吗?
欢迎所有建议我认为没有好的答案:) 但我解决了这个问题: 我预编译了表达式,如果它是一个简单的init(类似于dto.setA(1))就用java代码执行它 另一种方法是对分离的进程使用分离的缓存,然后将其删除 这是解决这个问题的一种非常具体的方法,但我为自己工作:)