Camel中批处理使用者的聚合结果(例如来自SQS)

时间:2018-05-02 14:11:19

标签: apache-camel amazon-sqs

我正在使用maxMessagesPerPoll=5设置来消耗来自SQS FIFO队列的消息。

目前我正在单独处理每条消息,这完全是浪费资源。 在我的情况下,因为我们使用FIFO队列并且所有这5条消息都与同一个对象相关,所以我可以将它们全部处理起来。

我虽然可以使用aggregate模式完成,但我无法获得任何结果。

我的消费者路线如下:

from("aws-sqs://my-queue?maxMessagesPerPoll=5&messageGroupIdStrategy=usePropertyValue")
    .process(exchange -> {
        // process the message
    })

我相信应该可以做这样的事情

from("aws-sqs://my-queue?maxMessagesPerPoll=5&messageGroupIdStrategy=usePropertyValue")
    .aggregate(const(true), new GroupedExchangeAggregationStrategy())
    .completionFromBatchConsumer()
    .process(exchange -> {
        // process ALL messages together as I now have a list of all exchanges
    })

但永远不会调用processor

第二件事: 如果我能够完成这项工作,何时将ACK发送到SQS?处理每条消息时或聚合过程何时完成?我希望后者

2 个答案:

答案 0 :(得分:1)

当未调用处理器时,聚合器可能仍在等待新消息进行聚合。

您可以尝试使用completionSize(5)代替completionFromBatchConsumer()进行测试。如果这样做,批处理完成定义就是问题所在。

针对经纪人的 ACK:遗憾的是没有。我认为消息在到达聚合器时被提交。

Camel聚合器组件是“有状态”组件,因此必须结束当前事务

出于这个原因,您可以为这些组件配备持久存储库,以避免在进程被终止时丢失数据。在这种情况下,如果您没有附加持久存储库,那么已经聚合的消息显然会丢失。

答案 1 :(得分:1)

问题在于GroupedExchangeAggregationStrategy

当我使用这个策略时,输出是一个"数组"所有的交流。这意味着到达完成谓词的交换不再具有初始属性。相反,它CamelGroupedExchangeCamelAggregatedSizecompletionFromBatchConsumer()

没有用处

由于我实际上并不需要汇总所有交易所,因此使用GroupedBodyAggregationStrategy就足够了。然后交换属性将保留在原始交换中,只有正文将包含一个"数组"

另一种解决方案是使用completionSize(Predicate predicate)并使用自定义谓词从分组交换中提取必要的值。