我需要嵌入j2v8-4.6.0 library(JavaScript引擎的绑定,V8),以便在neo4j-community-3.1.0(图形数据库管理系统)用户定义的函数中使用。
所以,我的简单插件的代码:
package js;
import org.neo4j.procedure.*;
import com.eclipsesource.v8.*;
public class J2V8
{
public static V8 v8 = V8.createV8Runtime();
@UserFunction("js.eval")
@Description("js.eval(code) - eval the given javascript code.")
public String eval( @Name("code") String code)
{
if (code == null) code = "";
try {
int result = v8.executeIntegerScript(code);
return result + "";
} catch (final Exception se) { return se.toString(); }
}
}
插件已正确编译和安装。并且用户函数js.eval
的第一次调用发生时没有错误。但是第二次调用(以及以下所有内容)都会出错:
Failed to invoke function `js.eval`: Caused by: java.lang.Error:
Invalid V8 thread access
我已经读过J2V8 enforces single threaded,并且对单个运行时的所有访问都必须来自同一个线程。
这意味着每次调用用户函数时,都需要创建运行时(V8.createV8Runtime
)。但这是一项代价高昂的行动。
所以问题是:每次调用函数时如何避免创建V8运行时的需要,并重新创建一次创建的V8运行时?
答案 0 :(得分:0)
您可以在完成执行后释放Locker,并在执行之前再次获取Locker。
main.test_function