Rabbitmq的過期時間


過期時間TTL

過期時間TTL表示可以對消息設置預期的時間,在這個時間內都可以被消費者接收獲取;過了之后消息將自動被刪除。RabbitMQ可以對消息和隊列設置TTL。目前有兩種方法可以設置。

  • 第一種方法是通過隊列屬性設置,隊列中所有消息都有相同的過期時間。
  • 第二種方法是對消息進行單獨設置,每條消息TTL可以不同。

如果上述兩種方法同時使用,則消息的過期時間以兩者之間TTL較小的那個數值為准。消息在隊列的生存時間一旦超過設置的TTL值,就稱為dead message被投遞到死信隊列, 消費者將無法再收到該消息。

image-20200902160748223

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 值,則兩者中較小的那個才會起作用。


免責聲明!

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



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