Rabbitmq两种实现延迟队列方式----死信和延迟插件

本文介绍了使用RabbitMQ实现延迟队列的两种方法:通过死信队列转换和使用延迟插件。在死信队列方法中,需要配置正常和死信交换机及队列,消息在指定时间后从正常队列转移到死信队列。而使用延迟插件则更简便,只需安装插件并声明延迟交换机和队列,通过设置x-delay参数即可实现延迟。代码示例展示了如何声明交换机和发送延迟消息。
摘要由CSDN通过智能技术生成

Rabbitmq两种实现延迟队列方式----死信和延迟插件

每天多学一点点~
话不多说,这就开始吧…

1.前言

平时工作中用到延迟队列的地方还是蛮多的;这里介绍下两种方式;一种通过死信队列转延迟队列;一种直接安装延迟插件实现延迟队列。

2.死信队列转延迟队列

在这里插入图片描述
以下直接在控制台声明了

  1. 正常交换机 zjq.test.dlx.normal.exchange fanout
  2. 死信交换机 zjq.test.dlx.exchange fanout
  3. 正常队列 zjq.test.dlx.normal.queue
  4. 死信队列 zjq.test.dlx.queue

步骤:

  1. 正常交换器 绑定 正常队列
  2. 正常队列 绑定 死信交换机 (加上2个参数 1. ttl:10s 就是过期时间,即延迟时间 2.x-dead-letter-exchange:zjq.test.dlx.exchange 绑定死信交换机 )
  3. 死信交换机 绑定 死信队列
  4. 只监听死信队列,不监听正常队列
  5. 往 正常交换机 发信消息 ,推到正常队列;正常队列没人消费,10s过后,转到 死信交换机 ,推到死信 队列 ,然后消费死信队列,实现延迟队列功能

在这里插入图片描述

这种还是比较麻烦的,要声明2个交换机+2个队列

3.延迟插件实现延迟队列

3.1 插件安装

下载对应版本的插件 rabbitmq_delayed_message_exchange-3.7.9.ez,
放入 RabbitMQ安装目录下的 plugins 目录。 进入RabbitMQ安装目录下的 sbin目录,在cmd窗口下执行如下命令使插件生效 如果后面发现在未失效请重启服务再查看

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

在这里插入图片描述

3.2 控制台声明推消息

  1. 延迟交换机 zjq.test.delay.exchange type:x-delayed-message Arguments x-delayed-type:topic
  2. 延迟队列 zjq.test.delay.queue
  3. 延迟交换机 绑定 延迟队列
    在这里插入图片描述
    推消息。因为博主这里声明的是fanout,所以没有routing key。
    header上加上参数 x-delay:10000 延迟时间
    在这里插入图片描述

3.3 代码声明

声明交换机

  @Bean
    public CustomExchange delayExchange() {
        Map<String, Object> args = new HashMap<>();
        args.put("x-delayed-type", "fanout");
        return new CustomExchange(MqConst.ORDER_TO_PRODUCT_DELAY_EXCHANGE_NAME, "x-delayed-message", true, false, args);
    }

发送消息

    public void senderDelayCheckMsg(MsgTxtBo msgTxtBo) {
        log.info("发送的消息ID:{}", msgTxtBo.getOrderNo());
        //表示为延时消息   加了 _delay 后缀 普通写法
        CorrelationData correlationData = new CorrelationData(msgTxtBo.getMsgId() + "_" + msgTxtBo.getOrderNo() + "_delay");
        // lamada  表达式写法  延迟 发送
        rabbitTemplate.convertAndSend(MqConst.ORDER_TO_PRODUCT_DELAY_EXCHANGE_NAME, MqConst.ORDER_TO_PRODUCT_DELAY_ROUTING_KEY,
                msgTxtBo, message -> {
            // 设置这个才有用
            message.getMessageProperties().setHeader("x-delay", 10000);
            return message;
        },correlationData);
       
    }

4.结语

世上无难事,只怕有心人,每天积累一点点,fighting!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值