我正在使用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?处理每条消息时或聚合过程何时完成?我希望后者
答案 0 :(得分:1)
当未调用处理器时,聚合器可能仍在等待新消息进行聚合。
您可以尝试使用completionSize(5)
代替completionFromBatchConsumer()
进行测试。如果这样做,批处理完成定义就是问题所在。
针对经纪人的 ACK:遗憾的是没有。我认为消息在到达聚合器时被提交。
Camel聚合器组件是“有状态”组件,因此必须结束当前事务。
出于这个原因,您可以为这些组件配备持久存储库,以避免在进程被终止时丢失数据。在这种情况下,如果您没有附加持久存储库,那么已经聚合的消息显然会丢失。
答案 1 :(得分:1)
问题在于GroupedExchangeAggregationStrategy
当我使用这个策略时,输出是一个"数组"所有的交流。这意味着到达完成谓词的交换不再具有初始属性。相反,它CamelGroupedExchange
和CamelAggregatedSize
对completionFromBatchConsumer()
由于我实际上并不需要汇总所有交易所,因此使用GroupedBodyAggregationStrategy
就足够了。然后交换属性将保留在原始交换中,只有正文将包含一个"数组"
另一种解决方案是使用completionSize(Predicate predicate)
并使用自定义谓词从分组交换中提取必要的值。