欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

04RabbitMq--ttl队列过期时间和死信队列

时间:2023-06-14

TTL队列过期时间

表示对消息设置预期时间,在这个时间内都可以被消费者获取,一旦过了这个时间,队列就会被自动删除。目前有两种方法设置:

通过队列属性设置,队列中所有消息都是相同的过期时间。对消息进行单独设置,不同的队列有不同的过期时间。
如果同时使用上面两种方法,则以先达到设置的小的ttl时间为准,一旦过了时间,则会变成死信队列,消费者无法获取此队列中的消息。

1.配置类

@Configurationpublic 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队列中。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。