先理解以下两点:
1.延迟队列存储是延时消息,指当消息被发送以后,不让消费者立即拿到消息,而是等待指定时间后,消费者才能拿到消息进行消费。(队列设置过期时间对队列中所有消息生效,如果队列和消息都设置了消息过期时间,会取时间短的)
2.入死信队列的三种情况:
1.请求被拒绝的消息
2.超过了设置的消息过期时间的消息
3.消息的数量超过最大队列长度的消息才会进入死信队列。
下面我演示几个场景,附具体代码:
场景1:(生产者向消费者1和消费者2发送消息,消费者1拒绝且丢弃消息,观察是否会进入死信队列;消费者2拒绝消息且设置消息重新入队,观察结果;消费者3消费死信)
生产者部分:
public class SendConfig {
//Queue队列的声明的5个参数分别是:
//name:队列名称
//durable:队列是否持久化
//exclusive:队列是否具有排他性:只对首次声明它的连接可见,会在这个连接断开的时候自动删除。
//autoDelete:队列是否自动删除:经历过至少一次连接后,所有的消费者都断开了连接,此时队列会进行自动删除。
//arguments:封装队列的一些参数。
@Bean
public Queue queue1() {
//封装arguments
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange","dieex"); //声明当前队列绑定的死信交换机
args.put("x-dead-letter-routing-key","die.aa"); //声明当前队列的私死信路由key
return new Queue("queue1", true, false, false, args);
}
@Bean
public Queue queue2() {
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange","dieex"); //声明当前队列绑定的死信交换机
args.put("x-dead-letter-routing-key","die.dd"); //声明当前队列的死信路由key
return new Queue("queue2", true, false, false, args);
}
//TopicExchange 的参数如下:
//name:交换机的名称;
标签:消费者,队列,args,RabbitMQ,Queue,死信,消息
From: https://blog.csdn.net/m0_73204222/article/details/142661083