camel支持并行执行路由,如:
<to uri="bean:camelBean?method=mutiA"/>
<multicast>
<!-- 并行执行mutiB、mutiC -->
<to uri="bean:camelBean?method=mutiB"/>
<to uri="bean:camelBean?method=mutiC"/>
</multicast>
<to uri="bean:camelBean?method=mutiD"/>
在执行mutiD方法之前,必须等待mutiB与mutiC方法都执行完毕时才会执行,在camel中如果路由并行执行,那么会自动复制之前exchange的消息,也就是说mutiB与mutiC的exchange对象属于两个,而mutiA与mutiD中的exchange对象属于同一个,所以如果在mutiB与mutiC中修改了exchange对象中的值,在mutiD方法中是无法获取到的,但是camel提供了聚合方法,聚合的意思是在mutiB方法与mutiC方法执行完毕时,触发聚合方法,在聚合方法中可将mutiB与mutiC中的exchange对象的值传入给mutiD中的excahnge。这样就可以在mutiD中获取了并行路由中的值。
如何自定义聚合策略
在spring配置文件中添加bean
<!-- 自定义聚合 -->
<bean id="myStrategy" class="com.xiaoka.camel.spring.aggregationStrategy.MyAggregationStrategy" />
import org.apache.camel.Exchange;
import org.apache.camel.processor.aggregate.AggregationStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 聚合策略
*
* @author liuchengbiao
*
*/
public class MyAggregationStrategy implements AggregationStrategy {
private static Logger logger = LoggerFactory.getLogger(MyAggregationStrategy.class);
// @Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
logger.info("自定义聚合...");
if (oldExchange == null) {
return newExchange;
} else {
String body1 = oldExchange.getIn().getBody(String.class);
String body2 = newExchange.getIn().getBody(String.class);
// 合并
String merged = (body1 == null) ? body2 : body1 + "," + body2;
logger.info("自定义聚合后的数据:" + merged);
oldExchange.getOut().setBody(merged);
return oldExchange;
}
}
}
在aggregate方法中自定义实现即可。
如何让camel识别到聚合策略
需要在 multicast 中添加 strategyRef 属性
<to uri="bean:camelBean?method=mutiA"/>
<multicast strategyRef="myStrategy">
<!-- 并行执行mutiB、mutiC -->
<to uri="bean:camelBean?method=mutiB"/>
<to uri="bean:camelBean?method=mutiC"/>
</multicast>
<to uri="bean:camelBean?method=mutiD"/>
这样就完成了聚合策略