首页 > 解决方案 > 收到标头时如何完成聚合器中的所有待处理消息

问题描述

我想根据骆驼路线创建类似“左外连接”的东西。在我的项目中,我有两条路线,它们使用来自 2 个数据库表的数据并将其逐行发送到下一步(joinData)。两个表都有相同的主键,我想根据这个主键连接这两个表中的数据。我的情况是:

 <route id="select1">
    //some code
    <to uri="direct:joinData"/>
 </route>

 <route id="select2">
    //some code
    <to uri="direct:joinData"/>
 </route>

 <route id="joinData">
   <from uri="direct:joinData"/>
   <aggregate strategyRef="joinStrategy" completionSize="2">
      <correlationExpression>
         <jsonpath>$.ID</jsonpath>
      <to uri="direct:result/>
   </aggregate>
</route>

来自两个来源的最后一条消息包含在上次选择记录时设置为 true 的特殊标头/属性。是否有一些可能性,当这个特殊的标头出现时,如何完成在聚合器中等待的剩余未决消息,或者更好的是,两个标头都来了?因为,现在只有加入的消息被发送到结果路由。当从数据库加载结束时,我想完成所有待处理的消息。

谢谢你的想法。

标签: apache-camel

解决方案


只需添加一个completionPredicate来告诉 Camel 在哪种情况下必须将聚合视为完整(在您的情况下,这是您的特殊标头/属性设置为 true 时)。您可以使用 CamelSimple language来表达谓词。例子:

<aggregate strategyRef="myStrategy" eagerCheckCompletion="true">
        ...
        <completionPredicate>
          <simple>${body} contains 'STOP'</simple>
        </completionPredicate>

推荐阅读