如何设置apache camel groovy脚本组件的属性

时间:2017-10-01 08:18:06

标签: java groovy apache-camel

我使用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"));

但我们如何在像这样的驼峰路由器中绑定属性。

感谢名单

2 个答案:

答案 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本身就无法解决这个问题。

但是,如果有人有解决方案,我真的很想知道它。