接上文 RabbitMQ-java使用消息队列
1 死信队列简介
死信队列模式实际上本质是一个死信交换机+绑定的死信队列,当正常队列的消息被判定为死信时,会被发送到对应的死信交换机,然后再通过交换机发送到死信队列中,死信队列也有对应的消费者去处理消息。
1.1 测试第一种(消息被拒绝)
直接在配置类中创建一个新的死信交换机和死信队列,并进行绑定:
@Configuration
public class RabbitConfiguration {
@Bean("directDlExchange")
public Exchange dlExchange(){
//创建一个新的死信交换机
return ExchangeBuilder.directExchange("dlx.direct").build();
}
@Bean("yydsDlQueue") //创建一个新的死信队列
public Queue dlQueue(){
return QueueBuilder
.nonDurable("dl-yyds")
.build();
}
@Bean("dlBinding") //死信交换机和死信队列进绑定
public Binding dlBinding(@Qualifier("directDlExchange") Exchange exchange,
@Qualifier("yydsDlQueue") Queue queue){
return BindingBuilder
.bind(queue)
.to(exchange)
.with("dl-yyds")
.noargs();
}
...
@Bean("yydsQueue")
public Queue queue(){
return QueueBuilder
.nonDurable("yyds")
.deadLetterExchange("dlx.direct") //指定死信交换机
.deadLetterRoutingKey("dl-yyds") //指定死信RoutingKey
.build();
}
...
}
删除rabbitmq管理页面的队列,关之前把springboot的application启动类关闭,否则删除完队列马上又创建新的队列
定义死信队列监听
@Component
public class TestListener {
@RabbitListener(queues = "dl-yyds", messageConverter = "jacksonConverter")
public void receiver(User user){
System.out.println(user);
}
}
启动服务器application。进入rabbitmq网页管理端,可以看到出现两个队列。
查看交换机
查看dlx.direct交换机详情
向amq.direct交换机发送消息
{"id":1,"name":"LB"}
此时yyds队列出现一条消息
将消息拒绝使其变为死信消息。
此时死信队列监听到拒绝的信息
1.1 测试第二种(消息TTL过期)
RabbitMQ支持将超过一定时间没被消费的消息自动删除,这需要消息队列设定TTL值,若消息的存活时间超过了Time To Live值,则会被自动删除,自动删除后的消息若有死信队列,则会进入死信队列。
给yyds队列设定TTL值(毫秒为单位):先把服务器关闭,然后删除队列yyds
启动服务,然后在amq.direct交换机详情发送消息{"id":1,"name":"LB"}
不进行处理5s后死信队列会监听到消息
1.1 测试第三种(队列达到最大长度)
关闭服务,删除yyds,在配置类添加参数,然后启动服务
同样在amq.direct交换机发送消息,发送三次消息分别为
{"id":1,"name":"LB"},{"id":2,"name":"LB"},{"id":3,"name":"LB"}
此时消息队列3条消息
此时死信队列未监听到数据
然后再发送一条
{"id":4,"name":"LB"}
然后发现死信队列监听器监听到消息,此时第四条消息把第一条挤出去了。
此时yyds队列还剩下三条消息