2015-02-07 85 views
2

處理的消息後SQS消息手動刪除春季雲AWS(1.0.0.RC2)當前實現SimpleMessageListenerContainer一樣類的似乎是消息處理程序處理完消息和方法調用返回後自動刪除郵件。spring-cloud-aws。成功地

在我們的應用,我們需要能夠處理的消息,並從上游SQS隊列中刪除該消息之前從下行隊列等待異步確認。像

東西收到SQS味精 - >進程味精 - >發佈味精的RabbitMQ(線程在這裏完成)

刪除SQS味精< - 我們的應用程序< - RabbitMQ的消息成功確認(異步)

由於msg ack通過不同的線程異步回來,一旦我們檢查了成功ack,我們需要選擇手動從SQS中刪除msg。

理想情況下,SimpleMessageListener應該是可配置爲哪個模式它在運行時(自動刪除或手動刪除)。

我們很願意使用Spring的AWS雲LIB(VS推出我們自己)與SQS集成,因爲它已經負責監聽器容器中的Bean的生命週期管理。

請讓我知道,如果上述建議的功能被認爲是可行的,如果是這樣,當它可以實現和釋放。

謝謝。

回答

2

我們可以添加一個標誌(除了已有的deleteMessageOnException標誌)以完全禁用消息的自動刪除,即使成功處理。我看到的問題是毒訊不再處理,可能會炸燬隊列。我爲那個here創建了一個問題。

你的方法會遇到另一個問題。如果消息沒有被足夠快地刪除(基於可見性超時),它將再次出現在你的處理程序方法中。

接收SQS MSG1 - >過程MSG1 - >發佈MSG1到的RabbitMQ(線程這裏完成)

接收SQS MSG2 - >過程MSG2 - >發佈MSG2到的RabbitMQ(線程這裏完成)

接收SQS MSG1 - >過程MSG1 - >發佈MSG1到RabbitMQ的MSG1又來了,因爲它沒有刪除

刪除SQS MSG1 < - 我們的應用程序< - RabbitMQ的MSG1成功確認(異步)

一個非常醜陋的解決方法,現在可能是拋出一個異常,在你的處理方法和deleteMessageOnException標誌設置爲。因此,任何消息都將被刪除,你可以得到收據手柄(與@Header@Headers)手動刪除它們。

編輯

現在的問題是固定的,可以直接與@SqsListener註釋定義刪除策略,並使用注射確認對象。請參閱this issue的最新評論

+0

當自動刪除功能被完全禁用時,應用程序有責任處理消息重複。我認爲這是一個合理的權衡。通過這種方式,它爲應用程序提供了對消息生命週期的更多控制。這同樣適用於處理有毒消息。通過中毒消息,我的意思是如果JSON負載無效或內容損壞,應用程序應該有機會決定如何處理消息(刪除或死信)。 – larryl 2015-02-11 00:59:13