因为延迟队列的需求非常多,所以RabbitMQ的官方也推出了一个插件,原生支持延迟队列效果。
这个插件就是DelayExchange插件。参考RabbitMQ的插件列表页面:Community Plugins — RabbitMQ
使用方式可以参考官网地址:Scheduling Messages with RabbitMQ | RabbitMQ - Blog
下载插件成功后配置到mq:
因为我是基于Docker安装,所以需要先查看RabbitMQ的插件目录对应的数据卷
我之前设定的RabbitMQ的数据卷名称为mq-plugins
,所以使用下面命令查看数据卷:
docker volume inspect mq-plugins
得到下面结果:
接下来,将插件上传到这个目录即可:
最后就是安装了,需要进入MQ容器内部来执行安装。我的容器名为mq
,所以执行下面命令:
docker exec -it mq bash
进入容器内部后,执行下面命令开启插件:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
结果如下:
DelayExchange插件原理
DelayExchange需要将一个交换机声明为delayed类型。当我们发送消息到delayExchange时,流程如下:
-
接收消息
-
判断消息是否具备x-delay属性
-
如果有x-delay属性,说明是延迟消息,持久化到硬盘,读取x-delay值,作为延迟时间
-
返回routing not found结果给消息发送者
-
x-delay时间到期后,重新投递消息到指定队列
使用DelayExchange
插件的使用也非常简单:声明一个交换机,交换机的类型可以是任意类型,只需要设定delayed属性为true即可,然后声明队列与其绑定即可。
1、基于注解方式:
2、 基于@Bean的方式:
3、发送消息时,一定要携带x-delay属性,指定延迟的时间