目录
前言
RabbitMQ的死信延时队列有时局限性较大,比如我需要能够实时调整消息的延迟时间。在这种情况下基于死信队列的延迟显得有些不够灵活。这时就需要使用这个插件让生产者发送消息的时候附带上延迟时间。
版本参数
SpringBoot | 2.6.13 |
RabbMQ服务端 | 3.12.12 |
正文
下载、安装、启用插件
1.访问RabbitMQ的插件官网:Community Plugins — RabbitMQ
2.下拉界面找到延时插件并点击Releases跳转到GitHub的下载界面(最好用谷歌浏览器访问下载地址)
3.下载.ez后缀的文件
4.移动这个.ez文件到RabbitMQ的插件目录下
5.启用插件(可以使用rabbitmq-plugins list指令来查找插件列表找到放在插件目录下的rabbitmq_delayed_message_exchange)
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
6.启动服务...
代码内容
1.建立交换机和队列以及绑定
@Component
public class TestRabbtiMQ {
//建立交换机和队列的名称常量
public static final String DELAY_QUEUES_SWITCH_NAME = "延时队列交换机";
public static final String DELAY_QUEUES_NAME = "延时队列";
//注册任意一个交换机(这里用的是能够进行广播分发的交换机)
@Bean("delayQueueSwitch")
public FanoutExchange delayQueueSwitch() {
FanoutExchange fanoutExchange = new FanoutExchange(DELAY_QUEUES_SWITCH_NAME);
//这个很重要,开启延时队列
fanoutExchange.setDelayed(true);
return fanoutExchange;
}
//再建立一个队列
@Bean("delayQueues")
public Queue delayQueues() {
return new Queue(DELAY_QUEUES_NAME);
}
//绑定交换机和队列,使用@Qualifier注解获取注入到容器中的队列和交换机
@Bean
public Binding binding(@Qualifier("delayQueues") Queue delayQueues,
@Qualifier("delayQueueSwitch") FanoutExchange delayQueueSwitch) {
return BindingBuilder.bind(delayQueues).to(delayQueueSwitch);
}
}
2.建立一个消费者
@Component
public class DelayedConsumer {
//消费者监听队列
@RabbitListener(queues = TestRabbtiMQ.DELAY_QUEUES_NAME)
public void consumer(String msg) {
//打印出来
System.out.println("msg = " + msg);
}
}
3.发送一条消息
@SpringBootTest
class RabbitMqDelayQueueOtherApplicationTests {
//注入springboot提供的发送工具类
@Autowired
RabbitTemplate rabbitTemplate;
//发送消息给MQ
@Test
public void send() {
rabbitTemplate.convertAndSend(
TestRabbtiMQ.DELAY_QUEUES_SWITCH_NAME,
"",//路由Key,但我们这里不需要用它
"我是一条消息",
message -> {
//设置延迟时间5000毫秒
message.getMessageProperties().setDelay(5000);
return message;
});
}
}
结语
大家可以看到,本文的延时队列在注册交换机的时候和网上其他文章的注册方式不同。一开始我也是根据网络上提供的整合教程以及插件的项目官网的教程进行整合实现的,注册交换机的时候需要new一个HashMap提供给交换机作为属性参数。后来在我阅读相关源码的时候就发现在注册交换机时可以直接把Delayed属性设为true就可以了无需传递什么其他参数。