天天看点

RabbitMQ之死信队列

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

消息被拒绝(basic.reject/ basic.nack)并且requeue=false

队列达到最大长度

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

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

还可以使用policy来配置:

通过RabbitMQ的管理界面可以看到:

RabbitMQ之死信队列

queue.dlx.test这个queue中有个“DLX”和“DLK”的标记. DLX关联的是exchangeName, DLK关联的是routingKey.

详细说明:

在RabbitMQ中有两个exchange: exchange.dlx.self和exchange.dlx.test,两个queue:queue.dlx.test和%DLX%queue.dlx.test

exchange.dlx.self是正常情况下,生产者发送消息到此exchange中,绑定关系如图:

RabbitMQ之死信队列

exchang.dlx.test是产生死信之后,原queue[queue.dlx.test]的死信发送到此exchange中,绑定关系如图:

RabbitMQ之死信队列

数据首先发送到 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

<a href="http://blog.csdn.net/u013256816/article/details/54916011">RabbitMQ之TTL(Time-To-Live 过期时间)</a>

<a href="http://blog.csdn.net/u013256816/article/details/54914525">RabbitMQ之mandatory和immediate</a>

<a href="http://blog.csdn.net/jiao_fuyou/article/details/22923935">RabbitMQ(四)RabbitMQ死信邮箱(DLX)</a>

<a href="http://www.rabbitmq.com/dlx.html">RabbitMQ Dead Letter Exchanges</a>