我使用apache camel脚本组件调用外部groovy文件。
from("activemq:queue:test.ChooseIManger")
.script().groovy("resource:classpath:tests/port/test.gsh")
我想在调用此脚本时传递一些属性。 我可以用简单的java代码做到这一点。
Binding binding = new Binding();
binding.setProperty("INPUTS", inputs);
binding.setProperty("RESULT", results);
GroovyShell shell = new GroovyShell(binding);
Object script = shell.evaluate(getScript("tests/port/test.gsh"));
但我们如何在像这样的驼峰路由器中绑定属性。
感谢名单
答案 0 :(得分:1)
根据documentation,您似乎应该能够使用自定义GroovyShellFactory重载默认的Groovy实例。
根据您提供的信息,这样的事情:
public class CustomGroovyShellFactory implements GroovyShellFactory {
public GroovyShell createGroovyShell(Exchange exchange) {
Binding binding = new Binding();
binding.setProperty("INPUTS", inputs);
binding.setProperty("RESULT", results);
return new GroovyShell(binding);
}
}
然后将该bean添加到您的上下文中。
答案 1 :(得分:0)
这在Camel中可能无法实现。在类evaluate
的方法org.apache.camel.language.groovy.GroovyExpression
中,所有先前设置的绑定都会被Camel绑定(例如camelContext
)覆盖,而不是被合并。
public <T> T evaluate(Exchange exchange, Class<T> type) {
Script script = instantiateScript(exchange);
script.setBinding(createBinding(exchange));
Object value = script.run();
return exchange.getContext().getTypeConverter().convertTo(type, value);
}
因此,所有绑定都会丢失。我想如果不改变Camel本身就无法解决这个问题。
但是,如果有人有解决方案,我真的很想知道它。