一、什麼是延遲隊列
延遲隊列,即消息發送之後,在一段時間之後延遲被消費端消費的消息隊列。比如我們發送一條消息,希望在半個小時之後纔可以被消費端消費到的這種場景中就可以用到延遲隊列了。
二、如何實現延遲隊列
從網上查詢了一下,有兩種方式:
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