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” 然后,将单独的 OrderItem 发送到 第 8.1 节 “基于内容的路由器”,它根据项目类型路由信息。在 widgetInventory bean 和 gadget 项被发送到 gadgetInventory bean 中,会发送 小部件 项。当适当的 bean 验证这些 OrderItems 后,它们会被发送到 第 8.5 节 “聚合器”,它会收集并重新集合验证的 OrderItems 到一个顺序。
每个收到的顺序都有一个包含 顺序 ID 的标头。我们在聚合步骤中使用顺序 ID: aggregate () DSL 上的 .header ("orderId") qualifier 指示聚合器将标头与键( orderId )用作关联表达式。
有关完整详情,请检查 camel-core/src/test/java/org/apache/camel/processor 的 ComposedMessageProcessorTest.java 示例源。