1 死信队列
1.1 什么是死信队列
死信队列主要是指因某种原因无法被消费者消费的信息,这些信息要么在队列中造成阻塞要么被直接删除掉从而造成消息丢失。比如:按照正常的逻辑来说,生产者生产消息发送到RabbitMQ的broke中,然后消费者从队列中获取消息进行消费,这是正常的消息队列运行状况。但如果由于特定的原因导致队列中的消息无法被消费,这些消息就变成了死信消息,而死信队列则是用来存储这些死信消息的。
死信消息的来源一般有三种,分别是:消息TTL过期,队列长度已满和消息被拒绝且没有重新入队
1.2 死信代码架构
死信队列处理流程一般为:当消息生产者生产出消息时,会将消息发送到broke的交换机上,交换机会根据路由key将消息转发到相对应的队列中给消费者消费,但如果消息者在消费消息过程中出现消息设置时间过期了,或者队列的长度已经满了和消息被拒绝且无法入队时,这些出现问题的消息就会变成死信消息,死信消息会被发送到死信交换机,死信交换机会将死信发送到相对应的死信队列中,让消费者02做相关的处理操作。
1.3 Web界面演示
1.设置交换机: 设置两个交换机,一个绑定正常队列,另一个绑定死信队列,交换机的类型可以随意选择,但要注意交换机类型的特点,比如说:direct类型要设置路由key等等
2.设置队列: 设置一个正常队列,并绑定direct交换机和设置死信交换机和消息过期时间,再设置一个普通队列绑定死信交换机作为死信队列
3.测试: 在direct交换机中发送一条消息,首先会发送到ttl_queue,10秒后消息过期进入死信队列
1.4 整合SpringBoot测试
1.创建生产者: 创建生产者,配置好Rabbit配置类和测试消息
package com.example.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
@Configuration
public class RabbitConfig {
//声明交换机
@Bean
public TopicExchange topicExchange(){
return new TopicExchange("ttl_exchange");
}
//声明死信交换机
@Bean
public FanoutExchange deadExchange(){
return new FanoutExchange("dead_exchange");
}
//声明队列
@Bean
public Queue queue(){
HashMap<String, Object> args = new HashMap<>();
args.put("x-message-ttl",10000);
args.put("x-dead-letter-exchange","dead_exchange");
//args.put("x-dead-letter-routing-key","");
return new Queue("ttl_queue",true,false,false,args);
}
@Bean
public Queue queue01(){
return new Queue("dead_queue",true);
}
//交换机绑定队列
@Bean
public BindingBuilder.TopicExchangeRoutingKeyConfigurer binding01(){
return BindingBuilder.bind(queue()).to(topicExchange());
}
@Bean
public Binding binding02(){
return BindingBuilder.bind(queue01()).to(deadExchange());
}
}
@Service