RabbitMQ之死信队列

RabbitMQ之死信队列DLX Dead Letter Exchange 利用 DLX 当消息在一个队列中变成死信 deadmessage 之后 它能被重新 publish 到另一个 Exchange 这个 Exchange 就是 DLX 消息变成死信一向有一下几种情况 消息被拒绝 basic reject basic nack 并且 requeue false 消息 TTL 过期 参考 RabbitMQ 之 TTL Time T


DLX, Dead-Letter-Exchange。利用DLX, 当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX。消息变成死信一向有一下几种情况:

  • 消息被拒绝(basic.reject/ basic.nack)并且requeue=false
  • 消息TTL过期(参考:RabbitMQ之TTL(Time-To-Live 过期时间))
  • 队列达到最大长度

DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性,当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列,可以监听这个队列中消息做相应的处理,这个特性可以弥补RabbitMQ 3.0以前支持的immediate参数(可以参考RabbitMQ之mandatory和immediate)的功能。

核心代码实现:通过在queueDeclare方法中加入“x-dead-letter-exchange”实现。

channel.exchangeDeclare("some.exchange.name", "direct"); Map 
   
     args = new HashMap 
    
      (); args.put("x-dead-letter-exchange", "some.exchange.name"); channel.queueDeclare("myqueue", false, false, false, args); 
     
   

你也可以为这个DLX指定routing key,如果没有特殊指定,则使用原队列的routing key

args.put("x-dead-letter-routing-key", "some-routing-key"); 

还可以使用policy来配置:

rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues 

修改RabbitMQ之TTL(Time-To-Live 过期时间)中的例子:

public static void createQueue(){ try { ConnectionFactory factory = new ConnectionFactory(); factory.setHost(ip); factory.setPort(port); factory.setUsername(username); factory.setPassword(password); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); Map 
   
     argss = new HashMap 
    
      (); argss.put("vhost", "/"); argss.put("username","root"); argss.put("password", "root"); argss.put("x-message-ttl",6000); argss.put("x-dead-letter-exchange","exchange.dlx.test"); argss.put("x-dead-letter-routing-key","queue.dlx.test"); channel.queueDeclare("queue.dlx.test", durable, exclusive, autoDelete, argss); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } 
     
   

数据首先发送到 exchange[exchange.dlx.self],根据routingkey[dlx]路由到queue.dlx.test,如果正常情况下,消费者可以消费queue.dlx.test的内容。但是如果queue.dlx.test中有消息变成了dead message即死信了,那么这个死信则会通过exchangeName=exchange.dlx.test, routingKey=”queue.dlx.test”路由到死信队列%DLX%queue.dlx.test中,如果要消费这个dead message, 此时消费者必须消费%DLX%queue.dlx.test中的内容而不是queue.dlx.test中的内容。

如果不指定x-dead-letter-routing-key参数,则使用原来的routingkey

欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-analysis-of-dlx/


参考资料

  1. RabbitMQ之TTL(Time-To-Live 过期时间)
  2. RabbitMQ之mandatory和immediate
  3. RabbitMQ(四)RabbitMQ死信邮箱(DLX)
  4. RabbitMQ Dead Letter Exchanges

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222118.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:32
下一篇 2026年3月17日 下午4:32


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号