这是我的路线的开头:
from("direct:initRoute").routeId("initRoute")
.log("Start route")
.beanRef("routeProcessor","extractProcessor")
.validate().method("fileProcessor","valid")
.beanRef("routeProcessor","initData")
.beanRef("routeProcessor", "choiceSendTo")
.recipientList(header("sendTo"));
然后根据Exchange
中的数据启动其他路线。
我将这条路线同步称为:
ProducerTemplate template = camelContext.createProducerTemplate();
ExchangeBuilder exchangeBuilder = new ExchangeBuilder(camelContext);
// Code that setup the exchange.
LOGGER.error("BEFORE");
template.send("direct:initTraitement", exchangeBuilder.build());
LOGGER.error("AFTER");
我希望我的日志中有以下oputput:
- BEFORE
- DATA INIT LOGS
- AFTER
- **RECIPIENTS ROUTES LOGS**
但我得到了这个:
- BEFORE
- DATA INIT LOGS
- **RECIPIENTS ROUTES LOGS**
- AFTER
我认为路线是独立的,所以如果我同步向路线发送请求,我会在路线完成后立即得到回复。但显然,整个过程(所有连接的路由)都是在我的其余代码运行之前执行的。
我希望我的代码在调用recipientList()
后继续执行。我怎样才能做到这一点?
我尝试在parallelProcessing()
之后使用recipientList()
,如documentation中所述,但它并没有解决我的问题。
编辑:我需要同步启动第一条路线。代码必须仅在initData
函数完成它的工作时运行。以下路由应该是异步的。
答案 0 :(得分:1)
parallelProcessing只是意味着如果您将多个端点提供给收件人列表,这些端点将被并行处理。请参阅parallelProcessing的文档:
Camel 2.2:如果启用,则会将邮件发送给收件人 同时。 请注意,调用线程仍会等到全部 消息在继续之前已经完全处理;是的 发送和处理收件人的回复 平行。
如果你想用producerTemplate执行一个路由,并且不想等到路由完成,你必须使用例如asynSend-method而不是send-method。
另一种可能性是确保sendTo标头配置了异步端点,如seda。
骆驼文档提供了更多信息,例如http://camel.apache.org/asynchronous-processing.html
亲切的问候, soilworker