Apache camel 驼峰“组合消息处理器”如何检测“未完成”

Apache camel 驼峰“组合消息处理器”如何检测“未完成”,apache-camel,Apache Camel,在我的骆驼路线上,我必须使用。这意味着我首先必须从db中分割出大结果集上的交换,然后再将其聚合 通过使用解耦的seda队列,我看到的问题是如何检测工作是否已完成—路线是手动触发的,并将运行数小时。我必须回电话告诉基础设施,工作已经完成 使用splitter-only变量不是一个好的选择,因为我会丢失aggreagator相关逻辑,因为相关的交换必须是有序的。但最大的问题是失去completionSize。我不能聚合成多个组 以下是该模式的一个示例: from("direct:start")

在我的骆驼路线上,我必须使用。这意味着我首先必须从db中分割出大结果集上的交换,然后再将其聚合

通过使用解耦的seda队列,我看到的问题是如何检测工作是否已完成—路线是手动触发的,并将运行数小时。我必须回电话告诉基础设施,工作已经完成

使用splitter-only变量不是一个好的选择,因为我会丢失aggreagator相关逻辑,因为相关的交换必须是有序的。但最大的问题是失去completionSize。我不能聚合成多个组

以下是该模式的一个示例:

from("direct:start")
    .split().body()
    .end()
    .to("seda:aggregate");

// collect and re-assemble the validated OrderItems into an order again
from("seda:aggregate")
    .process(setHeaders)
    .aggregate(new MyOrderAggregationStrategy()).header("orderId").completionSize(header("count"))
    .parallelProcessing()
    .process(doTheWork)
    .to("mock:result");
以下是仅用于拆分器的示例:

from("direct:start")
    .routePolicy( finishNotifier ) //implements onExchangeDone
    .split(body(), new MyOrderStrategy())
    .parallelProcessing()
    .process(doTheWork)
    .to("bean:MyOrderService?method=buildCombinedResponse")

附带说明:只有在禁用并行处理的情况下,才可以链接拆分和聚合。启用并行处理后,在finishNotifier.onExchangeDone之后调用工作。因为我在工作完成时调用context.stop,所以在camel停止后调用了process方法

您可以实施自己的自定义聚合策略,该策略依赖于计算接收到的交换数量与流程拥有的记录总数。您还可以查看《骆驼行动》一书的第8-10章,了解许多基本实现示例的拆分器和聚合模式的非常好的参考示例。如果您使用的是camel,我强烈建议您至少选择一份PDF副本,因为它可以相当容易地涵盖您的典型企业用例

这篇博文对于解决为您的用例正确设置聚合的一些问题也非常有用:


很抱歉回答我自己的问题,但我找到了一个非常简单的解决方案。我遇到这种模式的原因是骆驼用户组的一个建议。潜在的问题是聚合器模式中的问题。 我最初的路由只是链接拆分器和聚合器,但需要在聚合器的输出上使用多线程


解决方案很简单:只需使用而不是并行处理。

您能发布一个简化版的路线,以及您所说的仅拆分器变体的含义吗。添加了两个变体的示例谢谢,但我知道这本书,也知道博客。最近几天我读了很多关于我的问题的书。我还提出了一个bug:在我的特殊情况下,我不知道需要预先处理的所有条目的数量。然后我建议在处理完所有文件后添加一条控制消息。您可以在拆分之后添加一个方法,将最终计数作为头发送到带有聚合器的路由,聚合器可以单独解释该消息并更新聚合实例。