camel系列-DynamicRouter、RecipientList、RoutingSlip三者区别

接收表(Recipient List)

接收表理解起来比较简单,由 recipientList 指定一个表达式来指定需要到达的路由端点,该路由可以是静态表达式,也可以是动态的数据。路由端点在消息发送后决策,比如会根据消息的内容进行路由



1
2
3
4
5
6
<route>
<from uri="jms:queue:a"/>
<recipientList>
<constant>seda:x,seda:y,seda:z</constant>
</recipientList>
</route>

路由表(Routing Slip)

**把路由表附加到每条消息中,指定处理步骤序列。(路由端点在消息体决策)**釆用特定的消息路由器包装每个组件,它读取路由表并把消息路由给表中的下一个组件。

1
2
3
4
5
6
7
@Test
public void testRoutingSlip() throws Exception {
// send the incoming message with the attached slip
template.sendBodyAndHeader("activemq:cheese", "Hello World", "whereTo", "mock:a,mock:c");

assertMockEndpointsSatisfied();
}
1
2
3
4
5
6
<route>
<from uri="activemq:cheese"/>
<routingSlip>
<header>whereTo</header>
</routingSlip>
</route>

动态路由器(DynamicRouter)

动态路由器确定的下一路由在执行完成后,Exchange 对象还会被返回到动态路由器中以便开始第二次循环判断,决定下路由

1
2
3
4
5
6
7
<route>
<from uri="direct:start"/>
<dynamicRouter>
<!-- use a method call on a bean as dynamic router -->
<method beanType="com.foo.MySlipBean" method="slip"/>
</dynamicRouter>
</route>
1
2
3
4
5
6
7
8
9
10
11
12
public String slip(String body, @Header(Exchange.SLIP_ENDPOINT) String previous) {
if (previous == null) {
return "mock:a";
} else if ("mock://a".equals(previous)) {
return "mock:b";
} else if ("mock://b".equals(previous)) {
return "mock:result";
}

// no more so return null
return null;
}

过程管理器(ProcessManager)

这是典型的服务编制,由 ProcessManager 承担流程管控职责,过程管理器虽然业务场景些不同,但技术层面可以通过动态路由器来实现

参考: