死信队列:DLX,dead-letter-exchange
利用dlx,当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个exchange,这个exchange就是dlx
消息变成死信的原因有:
1.消息被拒绝(basic.reject / basic.nack)并且reQueue=false
2.消息TTL过期
3.队列达到最大长度了
dlx也是一个正常的exchange,和一般的exchange没什么区别,它能在任何队列上被指定,实际上就是设置一个属性。
当这个队列中有死信时,rabbitMQ就会自动的将这个消息重新发布到设置的exchange上去,进而被路由到另一个队列。
可以监听这个队列中消息做相应的处理,这个特性可以弥补rabbitMQ3.0以前支持的immediate参数功能。
死信队列的设置:
首先要设置死信队列的exchange和queue,然后进行绑定:
exchange: dlx.exchange
queue: dlx.queue
routingkey: #
然后进行正常声明交换机、队列、绑定,只不过需要在队列加上一个参数即可: argument.put("x-dead-letter-exchange", "dlx.exchange");
这样消息在过期、reQueue、队列在达到最大长度时,消息就可以直接路由到死信队列
代码实现:代码地址: https://github.com/hmilyos/rabbitmq-api-demo
生产端先把消费端启动,去管控台查看test_dlx_exchange以及test_dlx_queue这两个普通的交换机、队列, 死信队列dlx.queue以及绑定的dlx.exchange是否创建成功
确认创建成功就关闭消费端,然后再启动生产端,这时候消息没被消费,一直在test_dlx_queue中,
消息还在普通队列中直到设置的超时时间后,消息就被转发到死信队列中
消息已被转发到死信队列中自此,死信队列的简单用法介绍完毕。
网友评论