binding issues

Andreas Mueller am at iit.de
Thu Jan 12 11:32:15 UTC 2017


I figured out what the problem is. Here is my Javascript callback function, simplified:

stream.create().memoryGroup("queues", "name").onCreate(function (memoryGroup, key) {
    stream.create().memory(key); 
    print("Add:"+ key+"="+stream.memory(key));
});
 
The “stream” variable is set in the bindings before evaluating the script:

ScriptContext newContext = new SimpleScriptContext();
streamContext.engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE);
streamContext.engineScope.put("stream", streamContext.stream);

Now, the first statement in the function accesses:

com.swiftmq.impl.streams.Stream at 47273fd1

But the second statement (print) has a different “stream” instance:

com.swiftmq.impl.streams.Stream at 6222f856

That’s why I’m not getting data set in the “stream” because they are different instances. Seems like a binding issue.

How can this happen?

-- 
Andreas Mueller
IIT Software GmbH
http://www.swiftmq.com



> On 12.01.2017, at 11:13, Sundararajan Athijegannathan <sundararajan.athijegannathan at oracle.com> wrote:
> 
> 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.athijegannathan at 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.
>> 
>> 



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.



More information about the nashorn-dev mailing list