Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 ApacheCamel:聚合交换完成时完成交换_Apache Camel - Fatal编程技术网

Apache camel ApacheCamel:聚合交换完成时完成交换

Apache camel ApacheCamel:聚合交换完成时完成交换,apache-camel,Apache Camel,在我的Apache Camel应用程序中,我有一个非常简单的路线: from("aws-sqs://...") .aggregate(constant(true), new AggregationStrategy()) .completionSize(100) .to("SEND_AGGREGATE_VIA_HTTP"); 也就是说,它接收来自AWS SQS的消息,将它们分成100个批次,然后通过HTTP将它们发送到某处 与来自SQS的消息的交换在进入聚合阶段时成功完成

在我的Apache Camel应用程序中,我有一个非常简单的路线:

from("aws-sqs://...")
    .aggregate(constant(true), new AggregationStrategy())
    .completionSize(100)
    .to("SEND_AGGREGATE_VIA_HTTP");
也就是说,它接收来自AWS SQS的消息,将它们分成100个批次,然后通过HTTP将它们发送到某处

与来自SQS的消息的交换在进入聚合阶段时成功完成,此时,
SqsConsumer
将它们从队列中删除

问题是聚合的exchange可能会发生某些情况(可能会在传递时出错),消息将丢失。我真的希望只有当这些原始交换所在的聚合交换也成功完成(传递了一批消息)时,这些原始交换才能成功完成(从队列中删除消息)。有办法做到这一点吗


谢谢。

您可以将
deleteAfterRead
设置为
false
并在将消息发送到HTTP端点后手动删除它们;您可以使用bean或处理器,通过AWS SDK库发送适当的SQS删除请求。当然,这是一个解决办法,但我看不到更好的办法

您想仅在交换完全成功时才从队列中删除消息?@SoucianceEqdamRashti是,但仅在聚合交换完成时删除。我不熟悉sqs,但它是否能够定义回退队列?例如,如果在处理过程中发生错误,则消息将被推送到该队列,而不是消失。否则,也许有一种方法可以将整个流程设置为一个巨大的事务,只有当事务完成时,消息才会从队列中删除。这听起来是我找到的最好的解决办法。如果我找不到直接的方法,我会这么做。还有一件事你可以尝试——在SQS URI中指定批量大小,并使用聚合器的
completionFromBatchConsumer
选项,而不是你现在使用的
completionSize
。我不确定它是否有帮助,但它应该很容易尝试。