延迟队列是指当消息被发送以后,并不是立即执行,而是等待特定的时间后 , 消费者才会执行该消息 。
延迟队列的使用场景有以下几种:
- 未按时支付的订单,30 分钟过期之后取消订单 。
- 给活跃度比较低的用户间隔 N 天之后推送消息,提高活跃度 。
- 新注册会员的用户,等待几分钟之后发送欢迎邮件等 。
- 通过消息过期后进入死信交换器 , 再由交换器转发到延迟消费队列,实现延迟功能;
- 使用官方提供的延迟插件实现延迟功能 。
二、实现延迟队列1、安装并启动延迟队列(1)下载延迟插件
https://Github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases.注意:需要根据你自己的 RabbitMQ 服务器端版本选择相同版本的延迟插件,可以在 RabbitMQ 控制台查看:
文章插图
文章插图
(2)将插件放到插件目录【RabbitMQ如何实现延迟队列?】接下来 , 将上一步下载的插件放到 RabbitMQ 服务器安装目录,如果是 Docker,使用一下命令复制:
docker cp 宿主机文件 容器名称或ID:容器目录如下图所示:
文章插图
之后,进入 docker 容器,查看插件中是否包含延迟队列:
docker exec -it 容器名称或ID /bin/bash rabbitmq-plugins list如下图所示:
文章插图
(3)启动插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange如下图所示:
文章插图
(4)重启RabbitMQ服务安装完 RabbitMQ 插件之后,需要重启 RabbitMQ 服务才能生效 。如果使用的是 Docker,只需要重启 Docker 容器即可:
docker restart 容器名称或ID如下图所示:
文章插图
(5)验收结果在 RabbitMQ 控制台查看 , 新建交换机时是否有延迟消息选项 , 如果有就说明延迟消息插件已经正常运行了 , 如下图所示:
文章插图
(6)手动创建延迟交换器(可?。?/h4>此步骤可?。ǚ潜匦耄? ,因为某些版本下通过程序创建延迟交换器可能会出错 , 如果出错了,手动创建延迟队列即可,如下图所示:
文章插图
2、编写延迟消息实现代码(1)配置交换器和队列
import org.springframework.context.annotation.Configuration;import org.springframework.amqp.core.*;import org.springframework.context.annotation.Bean;/** * 延迟交换器和队列 */@Configurationpublic class DelayedExchangeConfig {public static final String EXCHANGE_NAME = "myDelayedExchange";public static final String QUEUE_NAME = "delayed.queue";public static final String ROUTING_KEY = "delayed.routing.key";@Beanpublic CustomExchange delayedExchange() {return new CustomExchange(EXCHANGE_NAME,"x-delayed-message", // 消息类型true, // 是否持久化false); // 是否自动删除}@Beanpublic Queue delayedQueue() {return QueueBuilder.durable(QUEUE_NAME).withArgument("x-delayed-type", "direct").build();}@Beanpublic Binding delayedBinding(Queue delayedQueue,CustomExchange delayedExchange) {return BindingBuilder.bind(delayedQueue()).to(delayedExchange()).with(ROUTING_KEY).noargs();}}
(2)定义消息发送方法import org.springframework.amqp.rabbit.core.RabbitTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;@Componentpublic class DelayedMessageProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;@Scheduled(fixedDelay = 5000)public void sendDelayedMessage(String message) {rabbitTemplate.convertAndSend(DelayedExchangeConfig.EXCHANGE_NAME,DelayedExchangeConfig.ROUTING_KEY,message,messagePostProcessor -> {messagePostProcessor.getMessageProperties().setDelay(10000); // 设置延迟时间,单位毫秒return messagePostProcessor;});}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何让Go程序以后台进程或daemon方式运行
- 如何使用Python、Apache Kafka和云平台构建健壮的实时数据管道
- 如何判断服务器所需带宽:基于业务需求和流量模式的关键考量
- ChatGPT元年之后,AI重塑世界,人类如何与其“智慧共生”?
- 低代码开发:Nacos配置详解,如何确保平台跳转正常运作
- 开发者如何使用Postgres扩展,包括AI应用?
- 2023年如何在线申请护照签证 2023年如何在线申请护照
- 腾讯文档如何停用网页版,腾讯视频网页版怎么关弹幕
- 360个人图书馆如何复制文字
- 口袋妖怪绿宝石掌门球如何获得