RabitMq过期时间TTL
第一种:给消息设置过期时间 启动一个插件 @Bean public DirectExchange DirectExchange() { return new DirectExchange("ttl_direct_exchange", true, false); } //给消息设置过期时间 @Bean public Queue ttlMessageQueue() { return new Queue("ttl.message.direct.queue", true); } @Bean public Binding ttlMessageBind() { return BindingBuilder.bind(ttlMessageQueue()).to(DirectExchange()).with("ttlMessage"); } public void ttlMessage() { String orderId= UUID.randomUUID().toString(); String exchangeName3="ttl_direct_exchange"; MessagePostProcessor messagePostProcessor=new MessagePostProcessor() { //设置消息的过期时间 @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setExpiration("5000"); message.getMessageProperties().setContentEncoding("UTF-8"); return message; } }; String ttl="ttlMessage"; rabbitTemplate.convertAndSend(exchangeName3,ttl,orderId); }
第二种给队列设置过期时间:
@Bean public Queue ttlQueue() { Map<String,Object> args=new HashMap<>(); args.put("x-message-ttl",5000);//这里过期时间一定是一个INT类型 return new Queue("ttl.direct.queue", true,false,false,args); } //绑定过期队列与路由 @Bean public Binding ttlBind() { return BindingBuilder.bind(ttlQueue()).to(DirectExchange()).with("ttl"); } public void makeOrder() { String orderId= UUID.randomUUID().toString(); System.out.println("订单ok"); //带有过期时间的ttl String exchangeName3="ttl_direct_exchange"; String ttl="ttl"; rabbitTemplate.convertAndSend(exchangeName3,ttl,orderId); }
如果:设置了两种过期时间,以时间短的为基准,因为无论是队列先过期,还是队列里面的消息先过期,另一个单独存在都没有意义
队列过期和消息过期的最大区别是,队列过期了里面的信息可以当作别处用,去处理,比如死信队列,
而消息过期就是单纯的过期,就是这条消息没有了
启用消息过期的插件 ./rabbitmq-plugins enable rabbitmq-delayed-message-exchange
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange
这个只是针对消息过期3.8.x不支持,队列过期还是一样的用
用法;开启插件 rabbitmq-plugins enable rabbitmq_delayed_message_exchange
声明一个死信队列:其实也是个普通队列,只不过下面去绑定过来而已
@Bean("order_real_dead_exchange") public DirectExchange deadExchange() { return new DirectExchange("order_real_dead_exchange", true, false); } @Bean("order_real_dead_queue") public Queue dead() { return new Queue("order_real_dead_queue", true); } @Bean public Binding deadBinding(@Qualifier("order_real_dead_queue") Queue queue ,@Qualifier("order_real_dead_exchange")DirectExchange directExchange) { return BindingBuilder.bind(queue).to(directExchange).with("real_dead"); }
声明绑定队列:
@Bean("order_producer_ttl_exchange") public DirectExchange producerExchange() { return new DirectExchange("order_producer_ttl_exchange", true, false); } //设置延迟队列 @Bean("order_producer_ttl_queue") public Queue producerQueue() { Map<String,Object> args=new HashMap<>(); // args.put("x-message-ttl",5000);//这里过期时间一定是一个INT类型 这里是声明队列过期 args.put("x-dead-letter-exchange","order_real_dead_exchange");//绑定死信队列交换机 // args.put("x-max-length",500);//指定最大接受多少条 args.put("x-dead-letter-routing-key","real_dead");//fanout没有key return new Queue("order_producer_ttl_queue",true,false,false,args); } @Bean public Binding producerBinding(@Qualifier("order_producer_ttl_queue") Queue queue, @Qualifier("order_producer_ttl_exchange")DirectExchange directExchange) { return BindingBuilder.bind(queue).to(directExchange).with("order_ttl_producer"); }
指定消息过期: rabbitTemplate.convertAndSend("order_producer_ttl_exchange","order_ttl_producer", bytes, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setExpiration("10000");//这条消息过期 message.getMessageProperties().setContentEncoding("UTF-8"); return message; } });
tips:延迟发送目前需要升级rabbitMq3.9才行 rabbitTemplate.convertAndSend("order_producer_delay_exchange","order_delay_producer", s, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setHeader("x-delay",10000); message.getMessageProperties().setContentEncoding("UTF-8"); return message; } });
一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰