死信交换机&延迟队列

这篇具有很好参考价值的文章主要介绍了死信交换机&延迟队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明:在MQ中,当一个队列中的消息出现以下情况时,就成为了死信(Dead Letter);

  • 被消费者拒绝消费或者声明失败,并且requeue设置为false,即不再重新入队列;

  • 队列中的消息存满,消息无法再入队列;

  • 消息过期

此时,可以通过指定死信交换机,把这些消息路由到一个专门存放死信的队列中,以消息超时过期为例:

死信交换机&延迟队列

设置一个有超时的队列,该队列中的消息超过10秒未被消费成为死信,并把消息由指定的死信交换机路由到指定的队列;

/**
 * 超时队列
 */
@Configuration
public class DelayConfig {

    /**
     * 创建延迟交换机
     * @return
     */
    @Bean
    public DirectExchange delayExchange(){
        return new DirectExchange("delay.direct",true,false);
    }

    /**
     * 创建延迟队列,该队列的消息需要延迟10秒,超时未消费后路由到死信交换机(death.delay.direct)那里去
     * @return
     */
    @Bean
    public Queue delayQueue(){
        return QueueBuilder.durable("delay.queue")
                .ttl(10000)
                .deadLetterExchange("death.delay.direct")
                .build();
    }

    /**
     * 绑定
     * @return
     */
    @Bean
    public Binding dlBinding(){
        return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay");
    }
}

接收死信交换机路由过来的消息

    /**
     * 接收死信交换机(death.delay.direct)路由过来队列(death.delay.queue)消息,路由关键字是delay
     * @param deathLetterMessage
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name ="death.delay.queue", durable = "true"),
            exchange = @Exchange(name = "death.delay.direct"),
            key = "delay"
    ))
    public void getDeathLetterMessage(String deathLetterMessage){
        System.out.println("deathLetterMessage = " + deathLetterMessage);
    }

发送一条消息

    /**
     * 发送消息到延迟队列中
     */
    @Test
    public void testDelayQueue(){
        String message = "hello, delay queue";

        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());

        rabbitTemplate.convertAndSend("delay.direct","delay",message,correlationData);
    }

延迟10秒后,被转发到死信交换机,路由到存放死信的队列并打印

死信交换机,rabbitmq,死信交换机,延迟队列

另外,如果给队列设置了超时,同时也给消息设置了超时,执行效果是,队列超时和消息超时,哪个短以哪个为准

    /**
     * 发送消息到延迟队列中
     */
    @Test
    public void testDelayQueue(){
        // 设置消息的超时为5000ms,即5秒
        Message message = MessageBuilder.withBody("hello , delay queue".getBytes(StandardCharsets.UTF_8))
                .setExpiration("5000")
                .build();

        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());

        rabbitTemplate.convertAndSend("delay.direct","delay",message,correlationData);
    }

延迟五秒,打印消息内容

死信交换机,rabbitmq,死信交换机,延迟队列

插件使用

因为延迟队列的使用场景非常多,所以RabbitMQ的官方也推出了一个插件,实现延迟队列的效果。(插件下载地址:https://www.rabbitmq.com/community-plugins.html)

死信交换机,rabbitmq,死信交换机,延迟队列

第一步:上传到服务器

输入下面的命令,数据卷名改成自己创建mq容器时,挂载的数据卷名

docker volume inspect 数据卷名

找到容器挂载的数据卷路径

死信交换机,rabbitmq,死信交换机,延迟队列

将下载后的插件复制到这里

死信交换机,rabbitmq,死信交换机,延迟队列

第二步:安装插件

安装插件需要进入到MQ容器中,输入下面的命令

docker exec -it 容器名 bash

输入下面的命令,安装插件

rabbitmq-plugins enable 插件名

安装成功

死信交换机,rabbitmq,死信交换机,延迟队列

第三步:使用

使用插件,不需要额外指定死信交换机,可直接在原队列、原消息上设置

在队列上设置,使用delayed属性

    /**
     * 使用插件实现延迟队列
     * @param delayMessage
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name ="plugins.delay.queue", durable = "true"),
            exchange = @Exchange(name = "plugins.delay.direct", delayed = "true"),
            key = "plugins"
    ))
    public void getDelayMessage(String delayMessage){
        System.out.println("delayMessage = " + delayMessage);
    }

如果使用@Bean注解方式创建,使用delayed()

    @Bean
    public DirectExchange delayedExchange(){
        return ExchangeBuilder
                .directExchange("plugins.delay.direct")
                .delayed()
                .durable(true)
                .build();
    }

消息设置,使用setHeader(“x-delay”, duration)方法

    /**
     * 发送消息到延迟队列中
     */
    @Test
    public void testPluginsDelayQueue(){
        // 设置消息的超时为5000ms,即5秒
        Message message = MessageBuilder.withBody("hello , plugins delay queue".getBytes(StandardCharsets.UTF_8))
                .setHeader("x-delay", 5000)
                .build();

        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());

        rabbitTemplate.convertAndSend("plugins.delay.direct","plugins",message,correlationData);
    }

延迟5秒,接收到消息

死信交换机,rabbitmq,死信交换机,延迟队列

总结

延迟队列可通过死信交换机和插件的方式实现,可应用于订单未支付,超时失效、预约等场景文章来源地址https://www.toymoban.com/news/detail-600547.html

到了这里,关于死信交换机&延迟队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ-死信交换机和死信队列

    DLX: Dead-Letter-Exchange 死信交换器,死信邮箱 当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。 如下图所示: 其实死信队列就是一个普通的交换机,有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理

    2024年02月08日
    浏览(44)
  • RabbitMQ学习笔记(消息发布确认,死信队列,集群,交换机,持久化,生产者、消费者)

    MQ(message queue):本质上是个队列,遵循FIFO原则,队列中存放的是message,是一种跨进程的通信机制,用于上下游传递消息。MQ提供“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后消息发送上游只需要依赖MQ,不需要依赖其它服务。 功能1:流量消峰 功能2:应用解耦 功

    2024年02月07日
    浏览(49)
  • 【学习日记2023.6.19】 之 RabbitMQ服务异步通信_消息可靠性_死信交换机_惰性队列_MQ集群

    消息队列在使用过程中,面临着很多实际问题需要思考: 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: 发送时丢失: 生产者发送的消息未送达exchange 消息到达exchange后未到达queue MQ宕机,queue将消息丢失 consumer接收

    2024年02月11日
    浏览(56)
  • RabbitMQ 备份交换机和死信交换机

      为处理生产者将消息推送到交换机中,交换机按照消息中的路由键及自身策略无法将消息投递到指定队列中造成消息丢失的问题,可以使用备份交换机。   为处理在消息队列中到达TTL的过期消息,可采用死信交换机进行消息转存。可以通过死信交换机的方式实现延迟队

    2024年02月14日
    浏览(49)
  • RabbitMQ系列之死信交换机的使用

      🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《RabbitMQ系列之死信交换机的使用》。🎯🎯 🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁           在我们上一期的RabbitMQ博客系列的分享中我们分

    2024年02月19日
    浏览(51)
  • RabbitMQ交换机与队列

    RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列 。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反, 生产者只能将消息发送到交换机(exchange) ,交换机工作的内容非常简单, 一方面它接收来自生产者的消息,另一方面

    2024年01月24日
    浏览(33)
  • RabbitMQ系列(27)--RabbitMQ使用Federation Exchange(联邦交换机)解决异地访问延迟问题

    前言: (broker北京)、(broker深圳)彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京)需要连接(broker北京),向其中的交换器exchangeA发送消息,此时的网络延迟很小,(Client北京)可以迅速将消息发送至exchangeA 中,就算在开启了publisherconfirm机制或

    2024年02月13日
    浏览(66)
  • RabbitMq创建交换机和队列

    1. 网页登录 IP:1572   2. 输入登录账号密码 admin admin 3. 点击Exchanges 添加交换机Platform_AlarmEngineInterface 和Rg_Platform_AlarmEngineInterface ,Type选择topic 4. 添加队列 VIDEO_Alarm_platform 、 watch_ftp、 RG_VIDEO_Alarm_platform 、 RG_VIDEO_Alarm_platform_jiance 5. 绑定交换机和队列 (1) 点击Exchanges界面,选择其

    2024年02月16日
    浏览(49)
  • RabbitMQ队列及交换机的使用

    目录 一、简单模型 1、首先控制台创建一个队列 2、父工程导入依赖  3、生产者配置文件  4、写测试类 5、消费者配置文件 6、消费者接收消息 二、WorkQueues模型 1、在控制台创建一个新的队列 2、生产者生产消息 3、创建两个消费者接收消息 4、能者多劳充分利用每一个消费者

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包