Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel Camel中批量消费者的聚合结果(例如来自SQS)_Apache Camel_Amazon Sqs - Fatal编程技术网

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)
完成了这项工作。这让我找到了解决方案,我将把它作为答案发布