8.14. 由消息处理器组成
由消息处理器组成
如 图 8.10 “由消息处理器模式组成” 所示,其包含 的消息处理器 模式允许您通过分割复合消息来处理复合消息,将子消息路由到适当的目的地,然后将响应重新置于单个消息中。
图 8.10. 由消息处理器模式组成
Java DSL 示例
以下示例检查是否可以填写多部门顺序,其中每个顺序的某一部分都需要在不同的清单中进行检查:
// split up the order so individual OrderItems can be validated by the appropriate bean from("direct:start") .split().body() .choice() .when().method("orderItemHelper", "isWidget") .to("bean:widgetInventory") .otherwise() .to("bean:gadgetInventory") .end() .to("seda:aggregate"); // collect and re-assemble the validated OrderItems into an order again from("seda:aggregate") .aggregate(new MyOrderAggregationStrategy()) .header("orderId") .completionTimeout(1000L) .to("mock:result");
XML DSL 示例
前面的路由也可以使用 XML DSL 编写,如下所示:
<route> <from uri="direct:start"/> <split> <simple>body</simple> <choice> <when> <method bean="orderItemHelper" method="isWidget"/> <to uri="bean:widgetInventory"/> </when> <otherwise> <to uri="bean:gadgetInventory"/> </otherwise> </choice> <to uri="seda:aggregate"/> </split> </route> <route> <from uri="seda:aggregate"/> <aggregate strategyRef="myOrderAggregatorStrategy" completionTimeout="1000"> <correlationExpression> <simple>header.orderId</simple> </correlationExpression> <to uri="mock:result"/> </aggregate> </route>
处理步骤
处理首先使用 第 8.4 节 “Splitter” 分割顺序。第 8.4 节 “Splitter” 随后将单个 OrderItems
发送到 第 8.1 节 “基于内容的路由器”,它根据项目类型路由信息。小部件 项目会发送在 widgetInventory
bean 和 gadget 项中的检查发送到 gadgetInventory
bean。旦相应的 bean 验证了这些 OrderItems
后,这些 OrderItems 会被发送到 第 8.5 节 “聚合器”,它将被验证的 OrderItems
重新收集并重新集合到 中。
每个接收的顺序都有一个包含 顺序 ID 的标头。我们在聚合步骤中使用顺序 ID: aggregate ()
DSL 命令的 .header ("orderId")
qualifier 指示聚合器使用带有键, orderId
的标头,作为 correlation 表达式。
如需详细信息,请检查 camel-core/src/test/java/org/apache/camel/processor 的 ComposedMessageProcessorTest.java
示例源。