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

Java 如何为apache camel groovy脚本组件设置属性,java,groovy,apache-camel,Java,Groovy,Apache Camel,我正在使用ApacheCamel脚本组件调用外部groovy文件 from("activemq:queue:test.ChooseIManger") .script().groovy("resource:classpath:tests/port/test.gsh") 我想在调用此脚本时传递一些属性。 我可以用如下简单的java代码来实现这一点 Binding binding = new Binding(); binding.setProper

我正在使用ApacheCamel脚本组件调用外部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"));
但是,我们如何像这样在camel路由器中绑定属性

Thanx

根据本文,您似乎应该能够通过使用自定义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添加到您的上下文中。

这在Camel中可能是不可能的。在类
org.apache.camel.language.groovy.GroovyExpression
的方法
evaluate
中,所有以前设置的绑定都会被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);
}
public T评估(交换,类类型){
脚本脚本=实例化脚本(交换);
setBinding(createBinding(exchange));
对象值=script.run();
返回exchange.getContext().getTypeConverter().convertTo(类型,值);
}
因此,所有绑定都将丢失。如果不改变骆驼本身,我想这是无法解决的


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

我已经这样定义了camelConext。@Inject@ContextName(“camelcdi上下文”)私有CamelContext camelctx;如何将此自定义工厂绑定到此上下文。有没有办法将其绑定到路由器。感谢您的回复。由于我们正在使用XMLDSL(OSGiBlueprint)开发路由,我无法100%确定您将如何将bean添加到上下文中。它可能是使用Spring依赖项注入完成的,就像使用XMLDSL一样。