主要有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 TTL
和Queue TTL
,則優先較小的那一個。
參考資料
代碼地址
作者:砒霜拌辣椒
鏈接:https://www.jianshu.com/p/341c63cf0459
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。