【问题标题】:Embedding j2v8 library in neo4j and reuse of the V8 runtime在 neo4j 中嵌入 j2v8 库并重用 V8 运行时
【发布时间】:2017-02-05 22:30:19
【问题描述】:

我需要嵌入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 运行时?

【问题讨论】:

  • 你试过使用同步单例吗?

标签: java neo4j java-threads j2v8 neo4j-plugin


【解决方案1】:

您可以在执行完成后释放Locker,并在执行前再次获取Locker。

if(v8==null) createV8Runtime();
v8.getLocker().acquire();
// execute your js here
v8.getLocker().release();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多