2016-03-30 31 views
1

我試圖通過使用RabbitMQ與JAVA一起構建一種異步服務器。我有兩個交換Original_Exch和Dead_Exch,並在每個隊列中。這兩個交易所都被宣佈爲DLX(彼此隊列的死信交換)。RabbitMQ,n重新排隊嘗試後如何刪除郵件

現在來解決這個問題,我以包含電子郵件信息(如To,Subject,Message body,attachment等)的json字符串的形式發佈消息給Original_Exch。從隊列中消耗此消息綁定到Original_exch後,我正在向指定的電子郵件地址發送電子郵件。如果電子郵件未成功發送,我將此消息傳送到Dead_Exch,並在2秒後(使用TTL)將消息再次傳送到Original_Exch。

讓我們假設一個特定消息由於連續失敗而從一個交換機移動到另一個交換機的場景。在這種情況下,我想確保如果它已被轉移到Original_Exch 10次,它應該從隊列中永久刪除(刪除),並且不應該轉移到Dead_Exch。

對於幾乎類似的問題有很多答案,但它們都不令人滿意(從學習者的角度來看)。

感謝..........

回答

2

消息,這些消息都已經死了,letterred有x-death頭與哪個隊列(S)後所經歷的細節和多少倍。請在RabbitMQ網站上查看article about dead-letter exchanges

所以你可以使用這個頭來做你想做的。我看到兩個解決方案:

  • 在你的消費者,當郵件無法送達,看x-death頭,如果你想決定死信它(Basic.Nack與requeue設置爲false)或下降它(Basic.Ack)。
  • 使用標頭交換類型Dead_Exch,並將綁定配置爲匹配x-death

由於標題交換僅對標題值做精確匹配,所以第一個解決方案更加靈活並且不易出錯。

相關問題