JDK8 Nashorn スクリプト エンジンを使用しています。私のスクリプトは、次のように Java クラスにコールバックを登録します。
stream.create().input(".env/router-memory-list/router1").management().onChange(function(){
print("onChange: "+input.current());
});
コールバック関数で参照されるinput
は、コールバックを実行する前に Java スレッドから設定され、実行後に削除されます (ctx.engineScope
はスクリプトの Binding オブジェクトです)。
ctx.engineScope.put("input", input);
input.current(message).executeCallback();
ctx.engineScope.remove("input");
通常は問題なく動作しますが、コールバックの実行中にこの種のエラーが発生することがあります。
<eval>:15 ReferenceError: "input" is not defined
at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57)
at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:319)
at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:291)
at jdk.nashorn.internal.objects.Global.__noSuchProperty__(Global.java:1432)
at jdk.nashorn.internal.scripts.Script$Recompilation$4$383$\^eval\_.L:13(<eval>:15)
at jdk.nashorn.javaadapters.java.lang.Runnable.run(Unknown Source)
at com.swiftmq.impl.streams.comp.io.ManagementInput.executeCallback(ManagementInput.java:105)
at com.swiftmq.impl.streams.processor.StreamProcessor.visit(StreamProcessor.java:92)
at com.swiftmq.impl.streams.processor.po.POMgmtMessage.accept(POMgmtMessage.java:28)
at com.swiftmq.tools.pipeline.PipelineQueue.process(PipelineQueue.java:35)
at com.swiftmq.tools.queue.SingleProcessorQueue.dequeue(SingleProcessorQueue.java:135)
at com.swiftmq.tools.pipeline.PipelineQueue$QueueProcessor.run(PipelineQueue.java:69)
at com.swiftmq.impl.threadpool.standard.PoolThread.run(Unknown Source)
synchronized
スレッドの問題である可能性があることを期待して、呼び出しコードを で囲みましたが、成功しませんでした。スタック トレースを見ると、動的に設定されたオブジェクトがBinding
失われている再コンパイルの問題である可能性があります。何か案は?
編集 - このスクリプトのバインディングを作成する方法は次のとおりです。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName((String) entity.getProperty("script-language").getValue());
if (engine == null)
throw new Exception("Engine for script-language '" + entity.getProperty("script-language").getValue() + "' not found!");
ScriptContext newContext = new SimpleScriptContext();
ctx.engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE);