Apache camel ApacheCamel:聚合交换完成时完成交换
在我的Apache Camel应用程序中,我有一个非常简单的路线: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的消息的交换在进入聚合阶段时成功完成
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
。我不确定它是否有帮助,但它应该很容易尝试。