簡體   English   中英

RabbitMQ DLX如何指定每個消息的TTL返回原始隊列?

[英]RabbitMQ DLX how to specify per-message TTL back to original queue?

我有一個無效的信件交換,按預期方式工作-當我收到一條消息時,它會去那里:

@Override
public void onMessage(Message message, Channel channel) throws Exception {
    // How to specify when the message will be put back to the original queue?
    // This doesn't work.
    message.getMessageProperties().setExpiration("3000");
    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}

但是我找不到的是如何將消息返回到原始隊列時指定每個消息。 請指教。

當郵件用死字母表示時,將刪除到期標頭。 其次,消息不會自動從死信隊列發送回原始隊列。

聽起來您想要一個具有每個消息等待時間的重試系統。 可以完成此操作,但不能完成當前操作。

基本模式是您先確認消息,然后將其發送到“延遲”交換並排隊。 此隊列將死信交換設置為應用程序的交換。 當消息到達延遲隊列時,它將一直停留在那里,直到達到消息TTL,並在發送給您的應用程序交換之前被發送死信。 但是,當您有可變的消息到期時間時,這將不起作用。 消息會從隊列的開頭變為死信,因此過期時間較長的消息將阻止后面的過期時間較短的消息。

因此,您有多種選擇來克服此問題。

  1. 有一些標准的延遲交換可供選擇,它們具有基於隊列的不同TTL,並且不設置消息過期時間。
  2. 在發送消息之前,聲明一個臨時延遲交換(自動刪除)並排隊(隊列TTL在消息過期幾秒鍾后過期)。 發送您的消息,經過正確的時間后,消息將變成死信,然后交換將自動刪除,隊列將過期並被刪除。 如果重試高峰期,這可能會非常昂貴。 但是,如果在到期時間限制后命名臨時交換和隊列,則它將在同一期間內被具有相同TTL發送的其他消息重用。
  3. NServiceBus具有使用多個延遲交換和隊列的巧妙技術: https ://docs.particular.net/nservicebus/rabbitmq/delayed-delivery

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM