So I wrote the test case! But I were not able to reproduce it - but found a bug on my side! Forgot to remove a listener somewhere which produced events on an old stream instance…
I’m developing since decades but still need to realize that there is only a very little chance it is a JDK bug. It’s always my code! I need to pin that mantra on my office wall. ;-) So, thanks a lot for you help! -- Andreas Mueller IIT Software GmbH http://www.swiftmq.com > On 12.01.2017, at 13:54, Sundararajan Athijegannathan > <sundararajan.athijegannat...@oracle.com> wrote: > > That does not give us much info. to debug the issue :( Please provide us with > a simple test case that reproduces the issue mentioned. > > Thanks, > -Sundar > > On 12/01/17, 5:02 PM, Andreas Mueller wrote: >> 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 >> >> <Mail Attachment.png> >> >>> 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. >> 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.