Rabbitmq实现延时队列的方式二延迟队列(Delay Queue)模式

本文详细介绍了如何在RabbitMQ中使用官方DelayExchange插件创建和管理延迟队列,包括插件的安装、配置、发送带延迟消息以及监听消息的过程,有助于解决死信队列问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为延迟队列的需求非常多,所以RabbitMQ的官方也推出了一个插件,原生支持延迟队列效果。

这个插件就是DelayExchange插件。参考RabbitMQ的插件列表页面:Community Plugins — RabbitMQ

1.将插件下载下来后,将插件上传到任意位置都可,我是默认上传到 了 根目录下:

2.复制插件到docker容器的rabbitmq容器的插件文件夹下

docker cp ./rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez 86310ba5518c:/plugins

3.进入容器,查看是否拷贝成功,并启动插件

进入容器

docker exec -it 86310ba5518c bash
cd plugins
ls

启动插件

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

在管理页面看到对应的交换机类型 证明安装插件并启动成功。

4.声明DelayExchange交换机和消息队列

( ̄(工) ̄)🐻代码如下:

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueueCJ {

    //交换机名称
    public static final String CJ_EXCHANGE = "cj_exchange";
    //消息队列名称
    public static final String CJ_QUEUE = "cj_queue";


    //声明DelayExchange交换机
    @Bean(CJ_EXCHANGE)
    public DirectExchange cjExchange() {
                                             //与普通交换机唯一的不同就是 .delayed() 声明它是一个延迟交换机
        return (DirectExchange) ExchangeBuilder.directExchange(CJ_EXCHANGE).delayed().durable(true).build();
    }

    //声明消息队列
    @Bean(CJ_QUEUE)
    public Queue cjQueue() {
        return new Queue(CJ_QUEUE, true);
    }

    //绑定交换机和消息队列
    @Bean
    public Binding bindingCJQueue(@Qualifier(CJ_EXCHANGE) DirectExchange directExchange ,@Qualifier(CJ_QUEUE) Queue queue) {
        return  BindingBuilder.bind(queue).to(directExchange).with(CJ_EXCHANGE);
    }

}

5.发送消息:

( ̄(工) ̄)🐻代码如下:

    @Autowired
    private RabbitTemplate rabbitTemplate;


    /**
     * 测试插件模式延迟队列
     * @throws UnsupportedEncodingException
     */
    @Test
    public void senTTLDLX() throws UnsupportedEncodingException {
        System.out.println(new Date());
        String str = "{'id' :'2'}";
        Message message = MessageBuilder.withBody(str.getBytes("utf-8"))
                .setHeader("x-delay",1000).build();
                                                           //指定key
        rabbitTemplate.convertAndSend(QueueCJ.CJ_EXCHANGE,QueueCJ.CJ_EXCHANGE,message);
    }

6.监听消息

( ̄(工) ̄)🐻代码如下:

@RabbitListener(queues = {QueueCJ.CJ_QUEUE})
    public void listener(@Payload Object msg) throws UnsupportedEncodingException {
        System.out.println(new Date());
        Message message = (Message) msg;
        String str = new String(message.getBody(),"utf-8");
        System.out.println("str = " + str);
    }

总结:

延迟队列插件的使用步骤包括哪些?

•声明一个交换机,添加delayed属性为true

•发送消息时,添加x-delay头,值为超时时间

该插件可以解决死信队列的先进先出限制的问题,没有了死信队列,直接是将消息发送给交换机的,该交换机可以将消息进行保存等待死亡时间到了,直接路由给队列,消费者就可以监听到消息了,延迟插件时牛逼啊!!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乖乖宝贝&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值