rabbitmq學習4-springboot與延遲隊列

一、什麼是延遲隊列

延遲隊列,即消息發送之後,在一段時間之後延遲被消費端消費的消息隊列。比如我們發送一條消息,希望在半個小時之後纔可以被消費端消費到的這種場景中就可以用到延遲隊列了。

二、如何實現延遲隊列

從網上查詢了一下,有兩種方式:

1、死信隊列(目前暫時還沒實踐過)

2、利用rabbitmq插件rabbitmq-delayed-message-exchange來實現

三、插件下載與安裝

1、下載插件

鏈接:https://pan.baidu.com/s/1WQNtL5-f6ABlF0Rss5oTEw 
提取碼:oooj 
請特別注意插件與你安裝的MQ版本是否合適

2、將插件解壓,將解壓後的文件移動到MQ的安裝目錄下

1、將插件複製到docker的MQ容器中

docker ps 

 

複製插件到該鏡像的/plugins目錄下

docker cp  插件絕對路徑 3a0f64b0c4c6:/plugins

2、進入容器

docker exec -it  3a0f64b0c4c6  /bin/bash

3、啓動插件

rabbitmq-plugins enable  rabbitmq_delayed_message_exchange

 

四、springboot與延遲隊列

1、配置

@Configuration
public class DelayMqConfig {
    public static final String QUEUE_NAME = "delay_queue";

    public static final String EXCHANGE_NAME = "delay_exchange";

    @Bean
    Queue delay_queue() {
        return new Queue(QUEUE_NAME, true);
    }

    // 定義一個延遲交換機
    @Bean
    CustomExchange delayExchange() {
        Map<String, Object> args = new HashMap<String, Object>();
        args.put("x-delayed-type", "direct");
        return new CustomExchange(EXCHANGE_NAME, "x-delayed-message", true, false, args);
    }

    // 綁定隊列到這個延遲交換機上
    @Bean
    Binding binding(Queue delay_queue, CustomExchange delayExchange) {
        return BindingBuilder.bind(delay_queue).to(delayExchange).with(QUEUE_NAME).noargs();
    }
}

2、生產者

@Controller
@RequestMapping("dealy")
public class SenderDelay {

    private Logger logger= LoggerFactory.getLogger(SenderDelay.class);

    @Autowired
    private AmqpTemplate rabbitTemplate;

    @RequestMapping("/sendMessage")
    public void sendMessage() {
        logger.info("調用接口/dealy/sendMessage");
        MessageProperties properties = new MessageProperties();
        properties.setDelay(20000);//延遲20秒
        Message message = new Message("delay_test_message".getBytes(), properties);
        rabbitTemplate.send(DelayMqConfig.EXCHANGE_NAME, DelayMqConfig.QUEUE_NAME, message);
    }
}

3、消費者

@Component
public class ReceiverDelay {
    private Logger logger= LoggerFactory.getLogger(ReceiverDelay.class);

    @RabbitListener(queues = DelayMqConfig.QUEUE_NAME)
    public void consumer(Message message) {
        logger.info(new Date() + " ---> " + new String(message.getBody()));
    }
}

測試:

參考博客:https://www.jianshu.com/p/6fb29a15b2a1

源碼地址:

鏈接:https://pan.baidu.com/s/1fI5Dm8qbZBxRyrMdJ81gJQ 
提取碼:nk3a 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章