Встраивание библиотеки j2v8 в neo4j и повторное использование среды выполнения V8

Мне нужно встроить библиотеку j2v8-4.6.0 (привязки для движка 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 обеспечивает однопоточность, и весь доступ к одной среде выполнения должен быть из одного потока.

Это означает, что каждый раз, когда вызывается пользовательская функция, необходимо создать среду выполнения (V8.createV8Runtime). Но это дорогостоящая операция.

Поэтому возникает вопрос: как избежать необходимости создавать среду выполнения V8 каждый раз при вызове функции и повторно использовать созданную среду выполнения V8?

0 ответов

Вы можете освободить шкафчик после завершения выполнения и снова получить шкафчик перед выполнением.

if(v8==null) createV8Runtime();
v8.getLocker().acquire();
// execute your js here
v8.getLocker().release();
Другие вопросы по тегам