当我使用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
方法。
答案 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