Встраивание библиотеки 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();