RabbitMq高級特性之TTL 存活時間/過期時間 通俗易懂 超詳細 【內含案例】


RabbitMq高級特性之TTL 存活時間/過期時間

介紹

  • RabbitMQ支持消息的過期時間, 在消息發送時可以進行指定
  • RabbitMQ支持隊列的過期時間, 從消息入隊列開始計算, 只要超過了隊列的超時時間配置, 那么消息會自動清除

每條消息設置過期時間

整個 Queue 隊列設置過期時間

前提

  1. 完成 RabbitMq高級特性之消費端限流

一、每條消息設置過期時間

1.更改ProducerTest.java文件

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class producerTest {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void test(){
        
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                //設置消息 3秒后過期
                message.getMessageProperties().setExpiration("3000");
                return message;
            }
        };
    
        String routingKey = "item.insert";
    
        int count = 1;
        while (count <= 9){
            String message = "發送第"+count+"條消息";
            //log.debug("路由鍵:{}",routingKey);
            if (count % 3 == 0){
                //給其中的第3 6 9條消息添加過期時間
                rabbitTemplate.convertAndSend(RabbitConfig.DIRECT_EXCHANGE,"",message,messagePostProcessor);
            } else {
                rabbitTemplate.convertAndSend(RabbitConfig.TOPIC_EXCHANGE_NAME,routingKey,message);
            }
            count++;
        }
        log.debug("發送成功");
    }
}

二、整個 Queue 隊列設置過期時間

1.更改RabbitMqConfig.java文件

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMq 配置類
 */
@Configuration
public class RabbitMqConfig {
    private static final String TOPIC_EXCHANGE_NAME = "topic_exchange";
    private static final String TOPIC_QUEUE_NAME = "topic_queue";

    /**
     * 創建 交換機
     * @return
     */
    @Bean
    public Exchange itemTopicExchange(){
        return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE_NAME).build();
    }

    /**
     * 創建 隊列
     * @return
     */
    @Bean
    public Queue itemQueue(){
        //QueueBuilder.durable(TOPIC_QUEUE_NAME).withArgument("x-message-ttl",3000).build();
        //與下句代碼 效果一致 寫一個就可以
        return QueueBuilder.durable(TOPIC_QUEUE_NAME).ttl(3000).build();
    }

    /**
     * 綁定 交換機與隊列
     * @param exchange
     * @param queue
     * @return
     */
    @Bean
    public Binding itemQueueExchange(@Qualifier("itemTopicExchange") Exchange exchange, @Qualifier("itemQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
    }

}

三、測試

直接運行ProducerTest.java單元測試即可,為了達到自動過期,消費端不可啟動

四、小結

  • 兩種模式可同時起作用,哪個時間短,就會執行哪個
  • Queue級別的過期時間一到,會自動丟掉消息,不會等到消費者來取消息.
  • Message級別的消息過期后,不會自動抹去,而是等到消費者獲取消息時進行判斷是否過期,如過期則丟掉.


免責聲明!

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



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