Not sure what you mean by "engine is shared between scripts". Each
separate Nashorn ScriptEngine instance is isolated. Nothing is shared
across different script engine instances. There are no java level
"statics" (i.e., process wide globals) that cut across engine instances.
On the same engine, there is compiled code is shared (.class and Class
objects in some cases) when possible. That should also not result in any
issue (there may be bugs).
Hope I addressed your questions,
-Sundar
On 12/01/17, 1:42 PM, Andreas Mueller wrote:
Will do.
Can you tell me whether the engine is shared between scripts? Is there a way to
use one engine per script and to start absolute clean (no caches, no refs from
previous runs) just like when the JVM was started?
Thanks,
Andreas
Am 12.01.2017 um 05:23 schrieb Sundararajan
Athijegannathan<sundararajan.athijegannat...@oracle.com>:
Will you please submit a bug with a compilable/runnable test case attached?
Thanks,
-Sundar
On 11/01/17, 11:09 PM, Andreas Mueller wrote:
Hi,
it seems I have a problem understanding Nashorn’s bindings...
I have multiple scripts, each independent of each other. They should run
concurrently with their own context and engine scope bindings. This is created
as follows for each script:
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();
streamContext.engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE);
Internally we have a Java-based processor which calls Javascript functions
(callbacks). It is always the same thread.
It works fine when I start a script the first time. If I stop it (without
stopping the JVM) and restart it (it runs through the code above) or if I run
another script concurrently, I’m getting problems in so far that calls inside a
Javascript callback to Java objects that set data don’t work. The data is not
null on the Javascript callback but null inside the Java method.
Here is an example callback:
stream.create().memoryGroup("queues", "name").onCreate(function (memoryGroup,
key) {
stream.create().memory(key);
print("Add:"+ key+"="+stream.memory(key));
});
The above “stream.create().memory(key)” is a Java method that has a printout:
AddMem: orderpos, mem=HeapMemory{name='orderpos’}
But when I retrieve it with "stream.memory(key)” in the print statement of the
Javascript function I’m getting:
Add:orderpos=null
For me this points to the bindings, e.g. a binding from a previous running
instance of the script or something else. Can somebody provide some help? What
do I need to do to have always a clean instance of a binding when I rerun a
script without stopping the JVM?
Thanks,
Andreas
IIT Software GmbH
Münsterstr. 111, 48145 Münster, Germany
Phone: +49 (0)2506 3049340
Managing Director: Andreas Müller
District Court: Amtsgericht Münster, HRB 16294
VAT-No: DE199945912
This e-mail may contain confidential and/or privileged information. If you are
not the intended recipient (or have received this e-mail in error) please
notify the sender immediately and destroy this e-mail. Any unauthorized
copying, disclosure or distribution of the material in this e-mail is strictly
forbidden.