binding issues

Sundararajan Athijegannathan sundararajan.athijegannathan at oracle.com
Thu Jan 12 15:44:42 UTC 2017


Hi,

Good to know that you've spotted the issue and fixed it! Thanks for 
informing us...

-Sundar

On 12/01/17, 8:01 PM, Andreas Mueller wrote:
> 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.athijegannathan at oracle.com 
>> <mailto:sundararajan.athijegannathan at 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 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
>>>
>>> <Mail Attachment.png>
>>>
>>>> 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.
>>>
>
>
>
> ------------------------------------------------------------------------
> 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