2017-06-22 1273 views
0

我有交換和隊列。生產者不需要消費確認,但由於缺乏其他數據,消費者在當前時刻可能無法處理消息。因此,我想將這些消息返回到隊列的末尾。這個怎麼做?或者當我拒絕信息時自動完成?返回消息到rabbitmq隊列末尾

流量:

  • 得到消息1消耗和在數據庫中創建一些記錄。
  • Message2被消耗並檢查數據庫中是否有記錄,如果是,則更新記錄。如果數據庫中沒有記錄,則應將消息返回到隊列末尾。

所以有消息排序問題,並在一般情況下,我得到消息的順序,因爲大多數組件正確地傳遞他們的消息。我想解決潛在的情況,當Message1的製作者由於重負載或其他原因而無法立即交換消息時。在這種情況下,Message2將被首先使用,但數據庫中沒有足夠的信息來處理它。我希望這條消息被返回到隊列中,但要確保這個Message2將會進入隊列尾部。如果它會發揮作用,如果我只使用一個隊列,則會發生無限循環。

側面的問題是,如果有可能跟蹤消費者嘗試處理消息的次數,但返回它。如果有可能像我之前描述的那樣將消息放到隊列的尾部,但由於某種原因,Message1的生產者死亡,並且不會有Message1,我想在經過一些重試或一段時間後使Message2失效。

回答

1

RabbitMQ總是將被拒絕的消息放在隊列的頭部。要將它們放在尾部,您必須自己發佈(例如使用RabbitTemplate)。您可以添加包含重試次數的標題。

+0

要鎖定到Gary的答案:您將消費該消息並看到您需要稍後處理它。再次發佈相同的消息並確認當前消息。要跟蹤重試,您可以按照建議的方式使用標題方法,或將該信息添加到您發佈的消息中。您可能希望在消息發佈的奇怪情況下添加一些冪等級處理,但確認沒有發生。您可以添加一個唯一的標識符到您的消息來啓用這種跟蹤。 –