2016-02-12 57 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
    相关问题