diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java index 84293b719c..6c88dcf9f4 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -14,13 +14,14 @@ package org.springframework.integration.scripting.jsr223; import java.util.Date; import java.util.Map; -import java.util.Map.Entry; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; +import javax.script.SimpleBindings; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.integration.scripting.ScriptExecutor; import org.springframework.integration.scripting.ScriptingException; import org.springframework.scripting.ScriptSource; @@ -31,6 +32,7 @@ import org.springframework.util.Assert; * * @author David Turanski * @author Mark Fisher + * @author Artem Bilan * @since 2.1 */ abstract class AbstractScriptExecutor implements ScriptExecutor { @@ -66,18 +68,18 @@ abstract class AbstractScriptExecutor implements ScriptExecutor { Object result = null; try { - if (variables != null) { - for (Entry entry : variables.entrySet()) { - scriptEngine.put(entry.getKey(), entry.getValue()); - } - } String script = scriptSource.getScriptAsString(); Date start = new Date(); if (logger.isDebugEnabled()) { logger.debug("executing script: " + script); } - result = scriptEngine.eval(script); + if (variables != null) { + result = scriptEngine.eval(script, new SimpleBindings(variables)); + } + else { + result = scriptEngine.eval(script); + } result = postProcess(result, scriptEngine, script); diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests-context.xml index 6096802dcc..5a15e6293d 100644 --- a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests-context.xml +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests-context.xml @@ -1,15 +1,17 @@ + http://www.springframework.org/schema/integration/scripting http://www.springframework.org/schema/integration/scripting/spring-integration-scripting.xsd + http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> @@ -19,4 +21,23 @@ ]]> + + + + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.java index d1d6f5e4cd..1511e3f721 100644 --- a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.java +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,9 @@ package org.springframework.integration.scripting.config.jsr223; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import java.util.HashSet; +import java.util.Set; + import org.junit.Test; import org.junit.runner.RunWith; @@ -26,12 +29,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.integration.Message; import org.springframework.integration.MessageChannel; import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.core.PollableChannel; +import org.springframework.integration.message.GenericMessage; import org.springframework.integration.support.MessageBuilder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Mark Fisher + * @author Artem Bilan * @since 2.0 */ @ContextConfiguration @@ -44,6 +50,12 @@ public class Jsr223TransformerTests { @Autowired private MessageChannel inlineScriptInput; + @Autowired + private MessageChannel int3162InputChannel; + + @Autowired + private PollableChannel int3162OutputChannel; + @Test public void referencedScript() { @@ -73,4 +85,22 @@ public class Jsr223TransformerTests { assertNull(replyChannel.receive(0)); } + @Test + public void testInt3162ScriptExecutorThreadSafety() { + for (int i = 0; i < 100; i++) { + this.int3162InputChannel.send(new GenericMessage(i)); + } + + Set result = new HashSet(); + + for (int i = 0; i < 100; i++) { + Message message = this.int3162OutputChannel.receive(1000); + result.add(message.getPayload()); + } + + assertEquals(100, result.size()); + + } + + }