Camel同步路由使用recipientList启动异步路由

时间:2014-11-20 11:34:16

标签: java asynchronous apache-camel synchronous

这是我的路线的开头:

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函数完成它的工作时运行。以下路由应该是异步的。

1 个答案:

答案 0 :(得分:1)

parallelProcessing只是意味着如果您将多个端点提供给收件人列表,这些端点将被并行处理。请参阅parallelProcessing的文档:

  

Camel 2.2:如果启用,则会将邮件发送给收件人   同时。 请注意,调用线程仍会等到全部   消息在继续之前已经完全处理;是的   发送和处理收件人的回复   平行。

如果你想用producerTemplate执行一个路由,并且不想等到路由完成,你必须使用例如asynSend-method而不是send-method。

另一种可能性是确保sendTo标头配置了异步端点,如seda。

骆驼文档提供了更多信息,例如http://camel.apache.org/asynchronous-processing.html

亲切的问候, soilworker