SpringBoot整合RabbitMQ+延时队列插件实现消息延迟发送

目录

前言

版本参数

正文

下载、安装、启用插件

代码内容

1.建立交换机和队列以及绑定

2.建立一个消费者

3.发送一条消息

结语

参考资料


前言

 RabbitMQ的死信延时队列有时局限性较大,比如我需要能够实时调整消息的延迟时间。在这种情况下基于死信队列的延迟显得有些不够灵活。这时就需要使用这个插件让生产者发送消息的时候附带上延迟时间。

版本参数

SpringBoot2.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就可以了无需传递什么其他参数。

参考资料

基于RabbitMq的实现消息延时发送的优点以及其局限性的文章(可以看看)

RabbitMQ社区插件官网

RabbitMQ延时队列插件GitHub项目地址(这里也有使用教程,只不过不是整合SpringBoot的)

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 添加rabbitmq依赖 在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置rabbitmq连接信息 在application.properties中添加以下配置: ``` spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建消息队列 在代码中创建消息队列,可以使用@Bean注解进行创建: ``` @Bean public Queue delayQueue() { return new Queue("delay_queue"); } ``` 4. 创建交换机 创建交换机,可以使用@Bean注解进行创建: ``` @Bean public DirectExchange delayExchange() { return new DirectExchange("delay_exchange"); } ``` 5. 绑定队列和交换机 将队列和交换机进行绑定,可以使用@Bean注解进行创建: ``` @Bean public Binding delayBinding() { return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key"); } ``` 6. 设置延时消息的TTL 设置延时消息的TTL,可以使用@Bean注解进行创建: ``` @Bean public CustomExchange customExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed_exchange", "x-delayed-message", true, false, args); } ``` 7. 发送延时消息 发送延时消息,可以使用rabbitTemplate发送消息: ``` rabbitTemplate.convertAndSend("delayed_exchange", "delay_key", message, message1 -> { message1.getMessageProperties().setHeader("x-delay", delayTime); return message1; }); ``` 其中,delayTime为延时时间,单位为毫秒。 完整代码如下: ``` @Configuration public class RabbitmqConfig { @Autowired private RabbitTemplate rabbitTemplate; @Bean public Queue delayQueue() { return new Queue("delay_queue"); } @Bean public DirectExchange delayExchange() { return new DirectExchange("delay_exchange"); } @Bean public Binding delayBinding() { return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key"); } @Bean public CustomExchange customExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed_exchange", "x-delayed-message", true, false, args); } public void sendDelayMessage(Object message, Integer delayTime) { rabbitTemplate.convertAndSend("delayed_exchange", "delay_key", message, message1 -> { message1.getMessageProperties().setHeader("x-delay", delayTime); return message1; }); } } ``` 调用sendDelayMessage方法即可发送延时消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值