TTL队列过期时间
表示对消息设置预期时间,在这个时间内都可以被消费者获取,一旦过了这个时间,队列就会被自动删除。目前有两种方法设置:
- 通过队列属性设置,队列中所有消息都是相同的过期时间。对消息进行单独设置,不同的队列有不同的过期时间。
如果同时使用上面两种方法,则以先达到设置的小的ttl时间为准,一旦过了时间,则会变成死信队列,消费者无法获取此队列中的消息。
1.配置类
@Configuration
public class ttlRabbitmqConfig {
@Bean
public Queue queue1(){
Map args = new HashMap<>();
args.put("x-message-ttl",5000);//设置过期时间
return new Queue("ttl.queue",true,false,false,args);//声明队列
}
@Bean
public DirectExchange ttlExchange() {//声明交换机
return new DirectExchange("ttl_order_exchange", true, false);
}
@Bean
public Binding bindingExchange() {//绑定交换机与队列关系
return BindingBuilder.bind(queue1()).to(ttlExchange()).with("ttl");
}
}
2.Service 层
public void makeOrderTtl(String userId, String productId, int num) {
String orderNumer = UUID.randomUUID().toString();
System.out.println("user:"+orderNumer);
String routeKey = "ttl";
// 发送订单信息给RabbitMQ fanout
rabbitTemplate.convertAndSend(ttlExchangeName, routeKey, orderNumer);
}
测试发现,生产者生产消息后5秒,队列中数据消息后消失,数据进入到死信队列。
死信队列
当一条消息在队列中出现一下三种情况如下,该消息就会变成一条死信。
- 消息被拒绝(basic.reject/basic.nack)并且requeue=false消息ttl过期,达到过期时间向队列中发送消息条数达到最大长度,再次发送消息就会移到死信队列
当消息在一个队列中变成一个死信后,如果配置了死信队列,它将重新发送到死信交换机,死信交换机将消息投递到一个队列上,这个队列就是死信队列。
1.配置类
@Bean
public Queue queue1(){
//做了参数的变更和消费不会失败,会报错,需删除再重建
Map args = new HashMap<>();
args.put("x-message-ttl",5000);//声明过期时间参数
args.put("x-dead-letter-exchange","dead_direct_exchange");//声明死信交换机参数
args.put("x-dead-letter-routing-key","dead");//声明死信队列路由key参数
return new Queue("ttl.queue",true,false,false,args);//创建队列
}
@Bean
public DirectExchange ttlExchange() {
return new DirectExchange("ttl_order_exchange", true, false);//交换机
}
@Bean
public Binding bindingExchange() {
return BindingBuilder.bind(queue1()).to(ttlExchange()).with("ttl");//绑定关系
}
2.Service层
//队列过期
public void makeOrderTtl(String userId, String productId, int num) {
String ttlExchangeName = "ttl_order_exchange";
String routeKey = "ttl";
String orderNumer = UUID.randomUUID().toString();
System.out.println("user:"+orderNumer);
// 发送订单信息给RabbitMQ fanout
rabbitTemplate.convertAndSend(ttlExchangeName, routeKey, orderNumer);
}
3.生产者发送消息
@Autowired
private TtlService ttlService;
@Test
void contextLoads2Ttl() throws InterruptedException {
ttlService.makeOrderTtl("1","1",12);
}
测试后发现,生产者发送数据后到ttl队列,5秒后,消息就转移到dead队列中。



