TTL队列过期时间
表示对消息设置预期时间,在这个时间内都可以被消费者获取,一旦过了这个时间,队列就会被自动删除。目前有两种方法设置:
通过队列属性设置,队列中所有消息都是相同的过期时间。对消息进行单独设置,不同的队列有不同的过期时间。如果同时使用上面两种方法,则以先达到设置的小的ttl时间为准,一旦过了时间,则会变成死信队列,消费者无法获取此队列中的消息。
1.配置类
@Configurationpublic class ttlRabbitmqConfig { @Bean public Queue queue1(){ Map
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
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队列中。