死信队列
什么是死信队列
- 消息被消费者确认拒绝。消费者把requeue参数设置为true(false),并且在消费后,向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。
- 消息达到预设的TTL时限还一直没有被消费。TTL时长可能是制队列的本身特性,也可能是消息的特性。
可以通过配置策略的方式实现:
rabbitmqctl set_policy TTL ".*" '{"message-ttl":60000}' --apply-to queues
也可以通过创建队列的时候声明,java代码如下:
java
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("myqueue", false, false, false, args);
- 消息由于队列已经达到最长长度限制而被丢掉
死信队列的配置方式
RabbitMQ中有两种方式可以声明死信队列,一种是针对某个单独队列指定对应的死信交换机,这个交换机也要绑定队列。另一种就是以
策略的方式进行批量死信队列的配置。
通过代码的方式给队列声明死信交换机
java
Channel channel = openChannel();
Map<String, Object> params = new HashMap<>();
params.put("x-message-ttl", 60000);
// 死信交换机的名称
params.put("x-dead-letter-exchange", "deadletterexchange");
// 死信队列的路由键
params.put("x-dead-letter-routing-key", "dde");
AMQP.Queue.DeclareOk declareOk = channel.queueDeclare(queueName, true, false, false, params);
channel.queueBind(queueName,"test1","ddeorigin");
针对多个队列,可以使用策略方式,配置统一的死信队列。
rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues