2015-06-22 3 views
2

Я пытаюсь использовать Python с пружинной интеграцией и Jython-автономным-2.7.0:Spring-интеграция сценарии с Python

Вот мой контекст приложения:

<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" /> 

Вот мой сценарий in Python:

print "Python" 
message="python-message" 

Когда я запускаю приложение, я вижу «Python» в консоли. Это должно означать, что мой скрипт запускается весной-интеграцией, но ничего не отправляется в udp.

Я вижу в коде, который в org.spring.framework.integration.scripting.js223.AbstractScriptExecutor:

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

Все переменные Python находятся в переменных картографирования и ScriptEngine не содержит никаких ссылок на переменные Python.

Таким образом, в org.spring.framework.integration.scripting.js223.PythonScriptExecutor:

scriptEngine.get(returnVariableName); 

возвращает нуль.

Это проблема в Jython, в интеграции Spring или, возможно, я делаю что-то неправильно?

+0

Я не уверен, где проблема, но Я воспроизвел; исследуя ... –

ответ

2

Это ошибка весной интеграции; Я открыл JIRA Issue.

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

Когда первая ветвь теста if берется, переменная результат добавляется к SimpleBindings объекта, а не добавляется к карте области видимости двигателя.

Несмотря на то, что в вашем случае переменные пусты, мы по-прежнему вызываем первую ветвь.

EDIT:

Вот работа вокруг, пока мы не исправить ошибку ...

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> 
+0

Еще раз спасибо Гэри. – Ludo

Смежные вопросы