Java 8和Camel 2.19.x在这里。我有以下骆驼路线:
<route id="widgetProcessing">
<from uri="activemq:inputQueue"/>
<to uri="{{widgetFetcher}}"/>
</route>
还有widgetFetcher
处理器:
@Component("widgetFetcher")
public class WidgetFetcher {
private WidgetDao widgetDao;
public WidgetFetcher(WidgetDao widgetDao) {
this.widgetDao = widgetDao;
}
public Widget getWidgetToProcess() {
// get the next widget id from the database
final Integer firstWidgetId = widgetDao.getFirstSubmittedWidgetId();
// Do lots of stuff with 'firstWidgetId' down here...
}
}
我想在<from>
之后和WidgetFetcher
之前创建一个交换属性,并将该属性的初始值设置为null
;然后有条件地从WidgetFetcher
内部将其值设置为其他值。此外,我希望在路由/处理的其余部分中将此重新分配的值“固定”。像这样:
<route id="widgetProcessing">
<from uri="activemq:inputQueue"/>
<setProperty propertyName="fizzId">
<constant>null</constant>
</setProperty>
<to uri="{{widgetFetcher}}"/>
<log message="fizzId = ${property[fizzId]}" loggingLevel="ERROR"/>
</route>
然后:
public Widget getWidgetToProcess(@ExchangeProperty("fizzId") final String fizzId) {
// get the next widget id from the database
final Integer firstWidgetId = widgetDao.getFirstSubmittedWidgetId();
if (someMethodReturnsTrue()) {
// Does this actually get saved outside the
log.info("About to update fizzId...")
fizzId = UUID.randomUUID().toString();
}
// Do lots of stuff with 'firstWidgetId' down here...
}
但是,在运行时,本地分配fizzId = ...
似乎不适合日志输出读取:
About to update fizzId...
fizzId = null
所以我认为我的处理器正在收到fizzId
交换属性的副本,但是内联重新辅助其值并不会实际修改其余路由的实际值。 关于如何执行此操作的任何想法?
答案 0 :(得分:2)
接受该交换,而不是将属性传递给处理器,然后您可以在交换上设置该属性。
答案 1 :(得分:1)
您可能需要引用更高的内容来设置该值。尝试对完整属性映射@Properties使用注释,或者让WidgetFetcher实现Processor以获得对完整交换的引用。