Camel:获取当前路由交换而不指定exchange作为参数

时间:2015-03-14 18:01:31

标签: java spring dependency-injection apache-camel

当我使用Camel时,几乎我编写的每个方法都将Exchange作为参数,以便通过自动绑定获得当前的交换。

类似的东西:

class MyClass
{
    void doSomething(Exchange exchange, ........)
    {
        exchange.getIn().....

        .......
    }
}

有没有办法获得当前的交换而不将其指定为参数?

也许是这样的......?

class MyClass
{
    @ExchangeAware
    Exchange exchange;

    void doSomething(........)
    {
        exchange.getIn().....

        .......
    }
}

更新

我实际上并没有考虑使用@ExchangeAware来天真地注入一些(哪个?:)特定的交换,但更多的是作为向框架发信号以拦截对该字段的任何访问的方式。此时,框架应该使用它必须绑定交换参数的交换(而不是使用当前的交换引用(可能为null))。

但为什么不让它变得更简单。怎么样这样做:

class MyClass
{
    @ExchangeAware
    Exchange getExchange() {return null;}

    void doSomething(........)
    {
        getExchange().getIn().....

        .......
    }
}

框架可以使用返回当前交换的方法覆盖@ExchangeAware方法。

2 个答案:

答案 0 :(得分:2)

不,这是不可能的。此外,它可能不是一个好主意,因为MyClass不再是线程安全的。如果两个并发Exchange被路由并调用相同的MyClass实例怎么办?然后注入的@ExchangeAware将是最后注入的任何可能干扰线程的内容。

最好保持你的pojo线程安全并在Exchange中作为参数的一部分传递 - 然后它们是线程安全的。

但是对于CamelContext来说,它只是一个不同的故事,因此您的班级可以实施CamelContextAware并注入CamelContext

答案 1 :(得分:-1)

骆驼2.9版有可能。

如果该方法是doSomething(交易所,字符串someOtherParam){}

然后可以从路由中调用这样的方法,如下所示:

.bean(bean_object_name,“ doSomething(*,'someOtherValue')”)

在这里*(通配符)将使Camel决定并注入交换对象。 有关更多详细信息,请参见:http://camel.apache.org/bean-binding.html