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
> <[email protected]> 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<[email protected]>:
>>>
>>> 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.