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

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

1. 简介

1.1 DLX简介

DLX: Dead-Letter-Exchange 死信交换器,死信邮箱

当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。
如下图所示:
RabbitMQ-死信交换机和死信队列,# RabbitMQ,rabbitmq,分布式,java
其实死信队列就是一个普通的交换机,有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理的。但是你可以配置某个交换机为此队列的死信交换机,该队列的消息成为死信后会被重新发送到此 DLX 。怎么处理这个DLX中的死信就是看具体的业务场景了,DLX 中的信息可以被路由到新的队列。

2.2 出现死信的情况

  • 队列长度到达限制,无法加入新的消息
  • 消费者拒接消费消息,并且不重回队列。该信息会被清除并进入死信队列
  • 原队列存在消息过期设置,消息到达超时时间未被消费

2.3 代码示例

死信队列可以定义单条消息和整个队列死信,分别是下方的2和4。

2.代码示例

以下定义了两个交换机,分别是普通交换机和死信交换机,定义了两个队列,分别是普通队列和死信队列。

@Configuration
public class RabbitConfig {
    final static String exchangeNormalName = "exchange.dlx.normal";
    final static String queueNormalName = "queue.dlx.normal";
    final static String exchangeDeadName = "exchange.dlx.dead";
    final static String queueDeadName = "queue.dlx.dead";


    //正常交换机
    @Bean
    public DirectExchange normalExchange(){
        return ExchangeBuilder.directExchange(exchangeNormalName).build();
    }
    //正常队列
    @Bean
    public Queue normalQueue(){
        Map<String, Object> map = new HashMap<>();
        map.put("x-message-ttl", 20000);//设置20s的过期时间
        map.put("x-dead-letter-exchange", exchangeDeadName);//设置死信交换机名字
        map.put("x-dead-letter-routing-key", "error");//设置死信交换机路由k
        return QueueBuilder.durable(queueNormalName)
                .withArguments(map)
                .build();
    }

    @Bean
    public Binding normalBinding(DirectExchange normalExchange, Queue normalQueue){
        return BindingBuilder.bind(normalQueue).to(normalExchange).with("order");
    }


    //死信交换机
    @Bean
    public DirectExchange dlxExchange(){
        return ExchangeBuilder.directExchange(exchangeDeadName).build();
    }
    //死信队列
    @Bean
    public Queue dlxQueue(){
        return QueueBuilder.durable(queueDeadName).build();
    }

    @Bean
    public Binding dlxBinding(DirectExchange dlxExchange, Queue dlxQueue){
        return BindingBuilder.bind(dlxQueue).to(dlxExchange).with("error");
    }

}

如上,设置普通交换机把过期内容放置到死信交换机中去。最重要的几行代码如下:

  • map.put(“x-message-ttl”, 20000);//设置20s的过期时间
  • map.put(“x-dead-letter-exchange”, exchangeDeadName);//设置死信交换机名字
  • map.put(“x-dead-letter-routing-key”, “error”);//设置死信交换机路由key

3.测试结果

RabbitMQ-死信交换机和死信队列,# RabbitMQ,rabbitmq,分布式,java

经过20s之后,如下,将普通队列的信息放入死信队列中

RabbitMQ-死信交换机和死信队列,# RabbitMQ,rabbitmq,分布式,java
其中TTL代表x-message-ttl,DLX代表x-dead-letter-exchange,DLK代表x-dead-letter-routing-key

4.单条消息

上方是将整个队列设置过期时间,也可以将单条消息设置过期时间,即不给整个队列设置过期时间

		//map.put("x-message-ttl", 20000);//设置20s的过期时间
        map.put("x-dead-letter-exchange", exchangeDeadName);//设置死信交换机名字
        map.put("x-dead-letter-routing-key", "error");//设置死信交换机路由k

而是在消息体中设置过期时间

@Component
@Slf4j
public class MessageService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void senMsg() throws InterruptedException {

        //定义消息
        String msg="单条消息过期时间test";
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration("10000"); //10s
        Message message= MessageBuilder.withBody(msg.getBytes()).andProperties(messageProperties).build();
        //发消息
        rabbitTemplate.convertAndSend("exchange.dlx.normal","order",message);
        log.info("消息发送完毕,发送时间为:{}", new Date());
    }
}

RabbitMQ-死信交换机和死信队列,# RabbitMQ,rabbitmq,分布式,java

RabbitMQ-死信交换机和死信队列,# RabbitMQ,rabbitmq,分布式,java文章来源地址https://www.toymoban.com/news/detail-716248.html

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

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

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

相关文章

  • RabbitMQ学习笔记(消息发布确认,死信队列,集群,交换机,持久化,生产者、消费者)

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

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

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

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

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

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

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

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

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

    2024年01月24日
    浏览(27)
  • 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日
    浏览(37)
  • RabbitMQ队列及交换机的使用

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

    2024年02月04日
    浏览(34)
  • 消息队列RabbitMQ.02.交换机的讲解与使用

    目录 RabbitMQ中交换机的基本概念与作用解析 交换机的作用: 交换机的类型: 直连交换机(Direct Exchange): 将消息路由到与消息中的路由键(Routing Key)完全匹配的队列。 主题交换机(Topic Exchange): 使用通配符匹配路由键,允许更灵活的消息路由。 扇形交换机(Fanout E

    2024年01月24日
    浏览(43)
  • RabbitMQ(一) - 基本结构、SpringBoot整合RabbitMQ、工作队列、发布订阅、直接、主题交换机模式

    Publisher : 生产者 Queue: 存储消息的容器队列; Consumer:消费者 Connection:消费者与消息服务的TCP连接 Channel:信道,是TCP里面的虚拟连接。例如:电缆相当于TCP,信道是一条独立光纤束,一条TCP连接上创建多少条信道是没有限制的。TCP一旦打开,就会出AMQP信道。无论是发布消息

    2024年02月14日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包