RabbitMQ中的死信队列

发布于:2022-12-26 ⋅ 阅读:(498) ⋅ 点赞:(0)

1.死信的概念

死信,顾名思义就是无法被消费的消息,

一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。

2.出现死信的原因

        1)消息 TTL 过期
        2)队列达到最大长度(队列满了,无法再添加数据到 mq 中)
        3)消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false.

3.示意图

关键代码:

1)设置消息过期时间

AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();

2)设置队列最大长度

Map<String,Object> params = new HashMap<>();

params.put("x-max-length",6);

params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
 //正常队列设置死信 routing-key 参数 key 是固定值
params.put("x-dead-letter-routing-key", "lisi");

String normalQueue = "normal-queue";

channel.queueDeclare(normalQueue, false, false, false, params);

3)消息被拒

if(message.equals("xxx")){
 System.out.println("Consumer01 接收到消息" + message + "并拒绝签收该消息");
 //requeue 设置为 false 代表拒绝重新入队 该队列如果配置了死信交换机将发送到死信队列中
 channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);
 }


网站公告

今日签到

点亮在社区的每一天
去签到