2016-11-30 23 views
1

在我的Apache Camel應用完整的交流,我有一個非常簡單的途徑:Apache的駱駝:當聚合交換完成

from("aws-sqs://...") 
    .aggregate(constant(true), new AggregationStrategy()) 
    .completionSize(100) 
    .to("SEND_AGGREGATE_VIA_HTTP"); 

也就是說,它需要在100批來自AWS SQS的消息,它們分組,並通過HTTP將它們發送到某處。

在進入聚合階段時,SQS消息的交換已成功完成,SqsConsumer在此時將其從隊列中刪除。

問題是,彙總交換可能會發生某些情況(可能會發生錯誤),並且郵件將丟失。只有當他們所在的彙總交易也成功完成(一批消息被交付)時,我才真正希望這些原始交易成功完成(消息從隊列中刪除)。有沒有辦法做到這一點?

謝謝。

+0

只有在交換完全成功後,您纔想從隊列中刪除消息嗎? –

+0

@SoucianceEqdamRashti是的,但只有當彙總交換完成時。 –

+0

我不熟悉平方,但它有能力定義退出隊列嗎?例如,如果在處理期間發生錯誤,則消息被推送到該隊列而不是僅僅消失。否則,也許有辦法將整個過程設置爲一個巨大的事務,並且只有當事務完成時才從隊列中移除消息。 –

回答

1

您可以將deleteAfterRead設置爲false,並在將消息發送給您的HTTP端點後手動刪除消息;您可以使用bean或處理器,並通過AWS開發工具包庫發送適當的SQS刪除請求。這是一個解決方法,但我沒有看到更好的方法。

+0

謝謝米洛斯。這聽起來像我找到的最好的解決方法。如果我找不到直接的方法,我會爲此而努力。 –

+0

您還可以嘗試另外一件事情 - 在SQS URI中指定批量大小,並使用聚合器的「completionFromBatchConsumer」選項而不是現在使用的「completionSize」。我不確定它是否會有所幫助,但它應該很容易嘗試。 –