首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在neo4j中嵌入j2v8库并重用V8运行时

在neo4j中嵌入j2v8库并重用V8运行时
EN

Stack Overflow用户
提问于 2017-02-06 06:30:20
回答 1查看 526关注 0票数 1

我需要嵌入j2v8-4.6.0 library ( JavaScript engine的绑定,V8),以便在neo4j-community-3.1.0 (图形数据库管理系统)用户定义函数中使用。

所以,我的简单插件的代码:

代码语言:javascript
复制
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的第一次调用没有错误地发生。但是第二次调用(以及下面的所有代码)会给出一个错误:

代码语言:javascript
复制
Failed to invoke function `js.eval`: Caused by: java.lang.Error:
Invalid V8 thread access

我读到过J2V8 enforces single threaded,所有对单个运行时的访问都必须来自同一个线程。

这意味着每次调用用户函数时,都需要创建运行时(V8.createV8Runtime)。但这是一项代价高昂的行动。

所以问题是:如何避免每次调用函数时都需要创建V8运行时,并重用创建的V8运行时?

EN

回答 1

Stack Overflow用户

发布于 2020-06-29 17:35:34

您可以在完成执行后释放Locker,并在执行之前重新获取Locker。

代码语言:javascript
复制
if(v8==null) createV8Runtime();
v8.getLocker().acquire();
// execute your js here
v8.getLocker().release();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42058077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档