2016-02-12 56 views
2

我有一個一紙空文交換預期其工作 - 當我NACK的消息,它會出現:RabbitMQ DLX如何指定每個消息的TTL回原始隊列?

@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); 
} 

但我無法找到是如何每條消息指定當消息應返回到原來的隊列。請指教。

+0

在這裏看到我的回答:

  • NServiceBus使用多個延遲交流和隊列有一個巧妙的技術http://stackoverflow.com/a/28636231/1173800 – jhilden

  • 回答

    0

    當郵件死信時刪除到期標題。其次,消息不會自動從您的死信隊列中發回您的原始隊列。

    聽起來好像你想要一個帶有每個消息等待時間的重試系統。這可以做到,但不是你現在做的方式。

    基本模式是,您確認您的消息,然後將其發送到「延遲」交換和隊列。這個隊列將你的應用程序的交換設置爲死信交換。當一個消息到達延遲隊列時,它會一直存在,直到到達TTL消息,並且在您的應用程序交換中死掉。但是,當您有可變消息到期時,這不起作用。消息從隊列的頭部消失,所以消息具有很長的到期時間會阻止消息在其後面過期較短。

    所以你有各種選擇來克服這個問題。

    1. 有幾個標準的延遲交換來選擇具有不同隊列的TTL並且不設置消息過期。
    2. 在發送消息之前,聲明一個臨時延遲交換(即自動刪除)和隊列(隊列TTL在消息過期後幾秒鐘過期)。發送你的信息,並在正確的時間後將被刪除,然後交換將自動刪除,隊列將過期並被刪除。如果您有重試的高峯,這可能會非常昂貴。但是,如果您在到期時間限制後命名臨時交換機和隊列,則它將被同一時間段內發送的具有相同TTL的其他消息重新使用。 https://docs.particular.net/nservicebus/rabbitmq/delayed-delivery
    相關問題