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@47273fd1

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

com.swiftmq.impl.streams.Stream@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.athijegannat...@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.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.
>> 
>> 



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.

Reply via email to