Эффективный способ подготовки пула Apache Commons двигателей Nashorn

Я использую Apache Commons Pool для создания пула движков Nashorn. При запуске приложения я вызываю preparePool() для подготовки minIdle числа экземпляров к eval() всем сценариям в движке, чтобы он был готов немедленно отвечать на вызовы invokeFunction().

Разминка

@Override
public NashornScriptEngine create() {
    // ...
    try {
        engine.eval(asset1);
        engine.eval(asset2);
        engine.eval(asset3);
    } // ...
    return engine;
}

В зависимости от размера пула и сложности предварительно загруженных скриптов это занимает значительное время.

Вопросы

  • Могу ли я разогреть только один экземпляр и безопасно клонировать его до числа minIdle экземпляров?

  • Можно ли безопасно сериализовать и сохранить клон созданного экземпляра? (что позволило бы поддерживать кеш движка, который нужно было аннулировать только в случае изменения одного из активов)

Связанные ресурсы (этот раздел будет обновляться по мере необходимости)


person sthzg    schedule 13.11.2015    source источник


Ответы (1)


Экземпляры движка Nashorn нельзя ни клонировать, ни сериализовать. Я бы посоветовал вам использовать один экземпляр движка и использовать ScriptEngine.createBindings() для создания нескольких объектов Bindings и объединения их. Тогда вам, очевидно, потребуется инициализировать каждую привязку вызовом метода ScriptEngine.eval(String|Reader, Bindings). (Вы также можете использовать объекты ScriptContext вместо Bindings; они практически представляют собой кортежи привязок и потоков out/err.)

Преимущество использования одного ScriptEngine заключается в совместном использовании кода. Вычисление одного и того же сценария в несколько привязок по-прежнему будет компилировать сценарий только один раз (если вы используете интерфейс Compilable), а код для всех объектов функций будет представлен одним и тем же скомпилированным байт-кодом.

person Attila Szegedi    schedule 06.12.2015