使用Python进行Spring集成脚本编写

时间:2015-06-22 14:31:49

标签: python spring-integration jython

我尝试将Python与spring-integration和jython-standalone-2.7.0一起使用:

这是我的申请背景:

<int:inbound-channel-adapter id="in" channel="exampleChannel" >
    <int:poller fixed-rate="1000" />
    <int-script:script lang="python" location="script/message.py" />
</int:inbound-channel-adapter>

<int:channel id="exampleChannel" />
<int-ip:udp-outbound-channel-adapter id="udpOut" channel="exampleChannel" host="192.168.0.1" port="11111" />

这是我在Python中的脚本:

print "Python"
message="python-message"

当我启动应用程序时,我看到&#34; Python&#34;在控制台中。这必须意味着我的脚本是由spring-integration启动的,但在udp中没有发送任何内容。

我在代码中看到org.spring.framework.integration.scripting.js223.AbstractScriptExecutor

result = scriptEngine.eval(script, new SimpleBindings(variables));

所有Python变量都在Map变量中,而scriptEngine不包含对Python变量的引用。

因此,在org.spring.framework.integration.scripting.js223.PythonScriptExecutor

scriptEngine.get(returnVariableName);

返回null。

这是Jython中的一个问题,在Spring集成中还是可能是我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是Spring Integration中的一个错误;我打开了JIRA Issue

        if (variables != null) {
            result = scriptEngine.eval(script, new SimpleBindings(variables));
        }
        else {
            result = scriptEngine.eval(script);
        }

当进行if测试的第一个分支时,结果变量将添加到SimpleBindings对象,并且不会添加到引擎范围映射中。

即使在你的情况下,变量是空的,我们仍然会调用第一个分支。

修改

这是解决问题的解决办法......

public class Foo {

    private final ScriptExecutor executor = ScriptExecutorFactory.getScriptExecutor("python");

    private final ScriptSource source = new ResourceScriptSource(new ClassPathResource("/message.py"));

    public String script() {
        return (String) this.executor.executeScript(source);
    }

}

<int:inbound-channel-adapter id="in" channel="exampleChannel" method="script">
    <int:poller fixed-rate="1000" />
    <bean class="foo.Foo" />
</int:inbound-channel-adapter>