Apache camel Camel中批量消费者的聚合结果(例如来自SQS)
我正在使用设置为Apache camel Camel中批量消费者的聚合结果(例如来自SQS),apache-camel,amazon-sqs,Apache Camel,Amazon Sqs,我正在使用设置为maxMessagesPerPoll=5的SQS FIFO队列中的消息 目前我正在单独处理每条消息,这完全是浪费资源。 在我的例子中,由于我们使用FIFO队列,并且所有这5条消息都与同一个对象相关,所以我可以一起处理它们 我认为这可以通过使用aggregate模式来实现,但我没有得到任何结果 我的消费者路线如下所示: from("aws-sqs://my-queue?maxMessagesPerPoll=5&messageGroupIdStrategy=useProper
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
})
但是永远不会调用处理器
第二件事:
如果我能做到这一点,ACK何时发送给SQS?处理每个单独的消息时,还是聚合过程完成时?我希望后者当处理器未被调用时,聚合器可能仍在等待新消息聚合 您可以尝试使用
completionSize(5)
而不是completionFromBatchConsumer()
进行测试。如果这样做有效,那么批处理完成定义就是问题所在
对于针对经纪人的确认:不幸的是,没有。我认为消息到达聚合器时已提交
驼峰聚合器组件是一个“有状态”组件,因此它必须结束当前事务
因此,您可以为这些组件配备持久存储库,以避免进程终止时数据丢失。在这种情况下,如果没有连接持久存储库,那么已经聚合的消息显然会丢失。问题在于
GroupedExchangeAgregationStrategy
当我使用这个策略时,输出是所有交换的“数组”。这意味着到达完成谓词的交换不再具有初始属性。相反,它有CamelGroupedExchange
和CamelAggregatedSize
,这对completionFromBatchConsumer()
由于我实际上并不需要聚合所有的交换,所以使用GroupedBodyAggregationStrategy
就足够了。然后exchange属性将保持原始exchange中的状态,仅正文将包含一个“数组”
另一个解决方案是使用
completionSize(谓词)
并使用自定义谓词从分组交换中提取必要的值。谢谢您的提示。实际上,使用copmletionSize(5)
完成了这项工作。这让我找到了解决方案,我将把它作为答案发布