Springboot整合RabbitMQ(四)——設置消息過期時間TTL


主要有2種方式:

  1. 指定一條消息的過期時間。
  2. 給隊列設置消息過期時間,隊列中的所有消息都有同樣的過期時間。

1、指定消息的過期時間

@RestController public class TTLController { @Autowired private RabbitTemplate rabbitTemplate; @PostMapping("/testTTL") public String testTTL() { MessageProperties messageProperties = new MessageProperties(); messageProperties.setExpiration("20000"); // 設置過期時間,單位:毫秒 byte[] msgBytes = "測試消息自動過期".getBytes(); Message message = new Message(msgBytes, messageProperties); rabbitTemplate.convertAndSend("TTL_EXCHANGE", "TTL", message); return "ok"; } } 

消息推送到隊列后,如果指定時間內沒有被消費,則會自動過期。

注意:
RabbitMQ只會對隊列頭部的消息進行過期淘汰。如果單獨給消息設置TTL,先入隊列的消息過期時間如果設置比較長,后入隊列的設置時間比較短。會造成消息不會及時地過期淘汰,導致消息的堆積。

2、給隊列中的所有消息設置過期時間

@Configuration public class TTLQueueRabbitConfig { @Bean public Queue TTLQueue() { Map<String, Object> map = new HashMap<>(); map.put("x-message-ttl", 30000); // 隊列中的消息未被消費則30秒后過期 return new Queue("TTL_QUEUE", true, false, false, map); } @Bean public DirectExchange TTLExchange() { return new DirectExchange("TTL_EXCHANGE", true, false); } @Bean public Binding bindingDirect() { return BindingBuilder.bind(TTLQueue()).to(TTLExchange()).with("TTL"); } } 

聲明隊列時設置1個x-message-ttl的屬性,並設置過期時間,凡是推送到該隊列中的所有消息,都會有一個30秒后過期的屬性。

可以看到創建的隊列有TTL的特性,表示該隊列中的消息會自動過期。

 
TTL隊列

如果同時指定了Message TTLQueue TTL,則優先較小的那一個。

RabbitMQ原生API實現消息自動過期

參考資料

代碼地址



作者:砒霜拌辣椒
鏈接:https://www.jianshu.com/p/341c63cf0459
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM