接收表(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 { 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 > <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" ; } return null ; }
过程管理器(ProcessManager)
这是典型的服务编制, 由 ProcessManager 承担流程管控职责,过程管理器虽然业务场景些不同,但技术层面可以通过动态路由器来实现
参考: