准备
下载延迟插件
查看镜像的信息获取版本号
docker inspect rabbitmq:management
根据版本号下载延迟插件
下载地址:https://www.rabbitmq.com/community-plugins.html
如下图所示,点Releases,会跳转到GitHub
上图RabbitMQ 版本是3.9.11,选择下载3.9.0版本的插件
将插件文件上传到服务器,我这里是直接上传到/root下了
安装插件并启用
将刚刚上传的插件拷贝到容器内plugins目录下
docker cp /root/rabbitmq_delayed_message_exchange-3.9.0.ez rabbit:/plugins
我刚刚是将插件上传到/root
下了; rabbit
是容器的name
,也可以使用容器id
进入到RabbitMQ容器内部
docker exec -it rabbit /bin/bash
查看插件是否存在
cd plugins
ls |grep delay
启用插件
(注意是在plugins内)
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
从容器内退出
exit
重启RabbitMQ容器
docker restart rabbit
容器启动成功之后,登录RabbitMQ的管理界面(ip:15672 访问web界面),找到Exchanges
Tab页。点击Add a new exchange
,在Type
里面查看是否有x-delayed-message
选项,如果存在就代表插件安装成功。
Java SpringBoot 代码部分
配置
@Configuration
public class RabbitConfig {
public static final String QUEUE_NAME = "javaboy_delay_queue";
public static final String EXCHANGE_NAME = "javaboy_delay_exchange";
public static final String EXCHANGE_TYPE = "x-delayed-message";
@Bean
Queue queue() {
return new Queue(QUEUE_NAME, true, false, false);
}
@Bean
CustomExchange customExchange() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
return new CustomExchange(EXCHANGE_NAME, EXCHANGE_TYPE, true, false,args);
}
@Bean
Binding binding() {
return BindingBuilder.bind(queue())
.to(customExchange()).with(QUEUE_NAME).noargs();
}
}
发送消息
/**
* 发送信息
*
* @param exchange 交换机
* @param routingKey 路由键
* @param obj 消息体
* @param delayTime 延迟时间(单位为ms)
*/
public void sendMsg(ExchangeEnum exchange, String routingKey, Object obj, int delayTime) {
rabbitTemplate.convertAndSend(exchange.getName(), routingKey, obj, message -> {
message.getMessageProperties().setDelay(delayTime);
return message;
});
}
/**
* 接收消息
*
* @param queue 队列
* @param timeOut 超时时间,为0表示默认
*/
public Object receiveMsg(QueueEnum queue, long timeOut) {
return rabbitTemplate.receiveAndConvert(queue.getName(), timeOut);
}