過期時間TTL
過期時間TTL表示可以對消息設置預期的時間,在這個時間內都可以被消費者接收獲取;過了之后消息將自動被刪除。RabbitMQ可以對消息和隊列設置TTL。目前有兩種方法可以設置。
- 第一種方法是通過隊列屬性設置,隊列中所有消息都有相同的過期時間。
- 第二種方法是對消息進行單獨設置,每條消息TTL可以不同。
如果上述兩種方法同時使用,則消息的過期時間以兩者之間TTL較小的那個數值為准。消息在隊列的生存時間一旦超過設置的TTL值,就稱為dead message被投遞到死信隊列, 消費者將無法再收到該消息。
1. 設置隊列TTL
在創建配置類添加如下內容:
/**
* @author WGR
* @create 2020/9/2 -- 15:44
*/
@Configuration
public class RabbitTTLMqConfig {
//隊列名稱
public static final String TTL_QUEUE = "ttl_queue1";
//聲明隊列
@Bean("ttlQueue")
public Queue ttlQueue(){
Map<String,Object> arguments = new HashMap<>();
arguments.put("x-message-ttl",60000);
return QueueBuilder.durable(TTL_QUEUE).withArguments(arguments).build();
}
}
然后在測試類 spring-rabbitmq-producer\src\test\java\com\dalianpai\rabbitmq\ProducerTest.java
中編寫如下方法發送消息到上述定義的隊列:
/**
* 過期隊列消息
* 投遞到該隊列的消息如果沒有消費都將在6秒之后被刪除
*/
@Test
public void ttlQueueTest(){
//路由鍵與隊列同名
rabbitTemplate.convertAndSend("ttl_queue1", "發送到過期隊列ttl_queue1,6秒內不消費則不能再被消費。");
}
參數 x-message-ttl 的值 必須是非負 32 位整數 (0 <= n <= 2^32-1) ,以毫秒為單位表示 TTL 的值。這樣,值 6000 表示存在於 隊列 中的當前 消息 將最多只存活 6 秒鍾。
如果不設置TTL,則表示此消息不會過期。如果將TTL設置為0,則表示除非此時可以直接將消息投遞到消費者,否則該消息會被立即丟棄。
2. 設置消息TTL
消息的過期時間;只需要在發送消息(可以發送到任何隊列,不管該隊列是否屬於某個交換機)的時候設置過期時間即可。在測試類中編寫如下方法發送消息並設置過期時間到隊列:
/**
* 過期消息
* 該消息投遞任何交換機或隊列中的時候;如果到了過期時間則將從該隊列中刪除
*/
@Test
public void ttlMessageTest(){
MessageProperties messageProperties = new MessageProperties();
//設置消息的過期時間,3秒
messageProperties.setExpiration("3000");
Message message = new Message("測試過期消息,3秒鍾過期".getBytes(), messageProperties);
//路由鍵與隊列同名
rabbitTemplate.convertAndSend("ttl_queue1", message);
}
expiration 字段以豪秒為單位表示 TTL 值。且與 x-message-ttl 具有相同的約束條件。因為 expiration 字段必須為字符串類型,broker 將只會接受以字符串形式表達的數字。
當同時指定了 queue 和 message 的 TTL 值,則兩者中較小的那個才會起作用。