Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RabbitMQ高级特性:死信队列

RabbitMQ高级特性:死信队列

作者头像
科技新语
发布于 2023-04-07 09:03:52
发布于 2023-04-07 09:03:52
2.8K00
代码可运行
举报
运行总次数:0
代码可运行
什么是死信队列?

死信队列,英文缩写DLX,Dead Letter Exchange(死信交换机),当消息成为Dead message(消息过期)后,可以被重新发送到另一个交换机,这个交换机就算是DLX,其实死信交换机(队列)和正常交换机(队列)没有什么区别

为什么叫死信队列但是翻译过来叫死信交换机呢,因为RabbitMQ比较特殊,其他MQ只有队列没有交换机这个概念的

正常来说,队列设置了过期时间,当消息到了队列之后,在过期时间内没有被消费,那么这个消息就被丢弃了,但是如果这个队列绑定了一个DLX死信队列(交换机),那么就算消息过期了也不会被直接丢弃掉,而是会发送给死信交换机,那么死信交换机又可以绑定其他队列,将这些消息存储到其他队列,从而又可以进行消息消费,就算这个意思,过程如图所示

什么情况下消息成为死信队列

消息成为死信队列的三种情况

1 队列消息长度达到限制

比如说给队列最大存储长度为10,当11条消息进来的时候,第11条消息进不去了,那么第11条消息就是死信

2 消费者拒绝消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false,

消费者使用basicNack/basicReject,并且requeue=false,表示消费者拒绝重新消费该消息

3 原队列存在消息过期设置,消息到达超时时间未被消费

原来的队列存在过期时间,但是到了过期时间还没有消费该消息

队列绑定交换机的方式
给队列设置两个参数 x-dead-letter-exchange(设置交换机的名称)和x-dead-letter-routing-key(发送消息时指定的routingkey)
死信队列代码实现

声明两套交换机队列,一套是正常的交换机队列,一套是死信的交换机队列

1 声明正常队列和交换机test_queue_dlx test_exchange_dlx

2 声明死信队列和死信交换机 queue_dlx exchange_dlx

3 正常队列绑定死信交换机

设置两个参数

1死信交换机名称 x-dead-letter-exchange

2发送给死信交换机的路由键 x-dead-letter-routing-key

1 消息过期时间的测试

测试过期时间的死信 给正常的交换机发送消息,过了存活时间消息自动从正常队列跑到死信队列

2 队列长度限制的测试

如果发送成功 那么因为设置了最大长度是10,只会有10条进行正常队列剩下的会跑到死信队列,过了10s后正常队列中的消息也会自动跑到死信队列中

3 消费者消息拒收的限制

消费者Consumer监听正常的队列,然后让消息拒绝接收并且不重回队列

由于消费者拒收消息,消息会直接跑到私信队列中

最终相关测试代码

生产者配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <? xml version="1.0" encoding="UTF-8" ?>

<beans xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xmlns:context="http://www.springframework.org/schema/context"

 xmlns:rabbit="http://www.springframework.org/schema/rabbit"

 xsi:schemaLocation="http://www.springframework.org/schema/beans

 http://www.springframework.org/schema/beans/spring-beans.xsd

 http://www.springframework.org/schema/context

 https://www.springframework.org/schema/context/spring-context.xsd

 http://www.springframework.org/schema/rabbit

 http://www.springframework.org/schema/rabbit/spring-rabbit.xsd" >

    <!--加载配置文件-->

 <context:property-placeholder location="classpath:application.properties" />



    <!-- 定义rabbitmq connectionFactory -->

 <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"

 port="${rabbitmq.port}"

 username="${rabbitmq.username}"

 password="${rabbitmq.password}"

 virtual-host="${rabbitmq.virtual-host}"

 publisher-confirms="true"

 publisher-returns="true"



 />



    <!--定义管理交换机,队列-->

 <rabbit:admin connection-factory="connectionFactory" />



    <!--定义rabbitTemplate对象操作可以在代码中调用api发送消息-->

 <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" />



    <!--消息的可靠性投递(生产端)-->

 <!--队列-->

 <rabbit:queue id="test_queue_confirm" name="test_queue_confirm" ></rabbit:queue>

    <!--交换机 广播-->

 <rabbit:direct-exchange name="test_exchange_confirm" >

        <!--绑定queue-->

 <rabbit:bindings>

            <rabbit:binding queue="test_queue_confirm" key="confirm" ></rabbit:binding>

        </rabbit:bindings>

    </rabbit:direct-exchange>



    <!--ttl消息存活时间-->

 <!--声明队列queue-->

 <rabbit:queue name="test_queue_ttl" id="test_queue_ttl" >

            <!--设置queue队列存活时间-->

 <rabbit:queue-arguments>

            <!--通过entry设置属性 键值对应的格式 key=键 value=值 value-type表示值的数据类型-->



 <!--设置队列存活为10s 默认单位为毫秒

 由于存换时间是int类型 这边声明的是字符串 需要使用value-type表名值是整形的 不指定会报错的 -->

 <!--x-message-ttl 指队列的过期时间-->

 <entry key="x-message-ttl" value="100000" value-type="java.lang.Integer" ></entry>

      

        </rabbit:queue-arguments>

    </rabbit:queue>



    <!--声明交换机-->

 <rabbit:topic-exchange name="test_exchange_ttl" >

        <!--绑定交换机和队列-->

 <rabbit:bindings>

            <rabbit:binding pattern="ttl.#" queue="test_queue_ttl" ></rabbit:binding>

        </rabbit:bindings>

    </rabbit:topic-exchange>





    <!--

 死信队列

 1 声明正常队列和交换机test_queue_dlx   test_exchange_dlx

 2 声明死信队列和死信交换机  queue_dlx exchange_dlx

 3 正常队列绑定死信交换机

 设置两个参数

 1死信交换机名称  x-dead-letter-exchange

 2发送给死信交换机的路由键 x-dead-letter-routing-key

 -->



 <!-- 1 声明正常队列和交换机test_queue_dlx   test_exchange_dlx-->

 <rabbit:queue id="test_queue_dlx" name="test_queue_dlx" >

        <!-- 3正常队列绑定死信交换机 使用arguments和entry设置参数-->

 <rabbit:queue-arguments>

            <!--3.1死信交换机名称  x-dead-letter-exchange-->

 <entry key="x-dead-letter-exchange" value="exchange_dlx" />

            <!--3.2发送给死信交换机的路由键 x-dead-letter-routing-key-->

 <entry key="x-dead-letter-routing-key" value="dlx.hehe" />

            <!--4让消息完成死信-->

 <!--4.1 设置队列过期时间 ttl 10s-->

 <entry key="x-message-ttl" value="10000" value-type="java.lang.Integer" />

            <!--4.2 设置队列的长度限制 max_length-->

 <entry key="x-max-length" value="10" value-type="java.lang.Integer" />

        </rabbit:queue-arguments>

    </rabbit:queue>

    <!--设置正常的交换机-->

 <rabbit:topic-exchange name="test_exchange_dlx" >

        <!--正常交换机绑定正常队列-->

 <rabbit:bindings>

            <rabbit:binding pattern="test.dlx.#" queue="test_queue_dlx" />

        </rabbit:bindings>

    </rabbit:topic-exchange>



    <!-- 2 声明死信队列和死信交换机  queue_dlx exchange_dlx-->

 <rabbit:queue id="queue_dlx" name="queue_dlx" />

    <!--设置正常的交换机-->

 <rabbit:topic-exchange name="exchange_dlx" >

        <!--正常交换机绑定正常队列-->

 <rabbit:bindings>

            <rabbit:binding pattern="dlx.#" queue="queue_dlx" />

        </rabbit:bindings>

    </rabbit:topic-exchange>





</beans>
复制代码

消费者配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <? xml version="1.0" encoding="UTF-8" ?>

<beans xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xmlns:context="http://www.springframework.org/schema/context"

 xmlns:rabbit="http://www.springframework.org/schema/rabbit"

 xsi:schemaLocation="http://www.springframework.org/schema/beans

 http://www.springframework.org/schema/beans/spring-beans.xsd

 http://www.springframework.org/schema/context

 https://www.springframework.org/schema/context/spring-context.xsd

 http://www.springframework.org/schema/rabbit

 http://www.springframework.org/schema/rabbit/spring-rabbit.xsd" >

    <!--加载配置文件-->

 <context:property-placeholder location="classpath:application.properties" />



    <!-- 定义rabbitmq connectionFactory -->

 <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"

 port="${rabbitmq.port}"

 username="${rabbitmq.username}"

 password="${rabbitmq.password}"

 virtual-host="${rabbitmq.virtual-host}"



 />



    <!--配置监听器bean 扫描这个包的路径 配置类需要加注解-->

 <context:component-scan base-package="com.wyh.listener" />

    <!--定义监听器    acknowledge="" 设置签收方式 -->

 <rabbit:listener-container  connection-factory="connectionFactory"  acknowledge="manual" prefetch="5" >

        <!--加载对应监听器的类 具体的类名和监听的队列名-->

 <!--  <rabbit:listener ref="qasCKListener" queue-names="test_queue_confirm"  />-->

 <!--

 <rabbit:listener ref="rabbitMQACKListener" queue-names="test_queue_confirm"  />

-->

 <!--监听正常队列 拒绝签收并不允许重返队列 成为死信队列-->

 <rabbit:listener ref="DLXCKListener" queue-names="test_queue_dlx" />

    </rabbit:listener-container>



</beans>
复制代码

生产者发送消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.producer.test;



import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.amqp.AmqpException;

import org.springframework.amqp.core.Message;

import org.springframework.amqp.core.MessagePostProcessor;

import org.springframework.amqp.rabbit.connection.CorrelationData;

import org.springframework.amqp.rabbit.core.RabbitTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;



 /**

 *  @prog ram: SpringBoot_RabbitMQ_Advanced

 *  @description:  测试确认模式消息是否发送成功

 *  @author:  魏一鹤

 *  @createDate:  2022-04-04 23:10

 **/



 //spring配置文件

@RunWith(SpringJUnit4ClassRunner.class)

 //加载文件的路径

@ContextConfiguration(locations = "classpath:spring-rabbitmq-producer.xml" )

public class ProducerTest {

    //注入 RabbitTemplate

 @Autowired

    private RabbitTemplate rabbitTemplate;



    /**

 * 确认模式:

 * 步骤

 * 1确认模式的开启:在connectionFactory中开启,默认是false不开启的 publisher-confirms="true"

 * 2回调函数的编写:在RabbitTemplate模板工具类定义ConfirmCallBack(回调函数).当消息发送出去的时候回调函数会自动执行,返回true(成功)或者false(失败)

 **/

 @Test

    public void testConfirm() {

        //定义确认模式的回调函数

  rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {

            @Override

            //匿名内部类

 /**

 * confirm有三个参数 下面一一说明

 * CorrelationData correlationData 相关的配置信息

 * boolean ack  exchange交换机是否成功收到了消息 true成功false失败

 * String cause 失败原因 ack=false

 **/

  public void confirm(CorrelationData correlationData, boolean ack, String cause) {

                System.out.println( "确认模式的回调函数被执行了!" ); //确认模式的回调函数被执行了!

 System.out.println( "消息是否发送成功?" +ack);

                if(ack){

                    //交换机接收成功生产者发送的消息

 System.out.println( "接收成功消息!原因是:" +cause);

                }else{

                    //交换机接收没有成功生产者发送的消息

 System.out.println( "接收失败消息!原因是:" +cause);

                    //将来会做处理,就算消息发送失败也会重新去发送消息,保证消息第二次发送成功

 }

            }

        });

        //发送消息

  rabbitTemplate.convertAndSend( "test_exchange_confirm" , "confirm" , "message confirm..." );

    }





    /**

 * 回退模式:当消息发送给Exchange交换机后,交换机路由到queue失败时才会执行ReturnCallBack

 * 步骤

 * 1回退模式的开启:在connectionFactory中开启,默认是false不开启的 publisher-returns="true"

 * 2回调函数的编写:在RabbitTemplate模板工具类定义ConfirmCallBack(回调函数).当消息发送出去的时候回调函数会自动执行,返回true(成功)或者false(失败)

 * 3设置Exchange处理消息的模式 它有两种模式

 *   3.1 第一种模式:如果消息没有路由到queue队列,则会丢弃消息(默认的方式)

 *   3.2 第二种模式:如果消息没有路由到queue队列,则返回给消息的发送方ReturnCallBack

 **/



 @Test

    public void testReturn() {



        //由于处理消息的模式默认是如果消息没有路由到queue队列,则会丢弃消息

 //所以需要设置交换机处理消息的模式,交换机会把消息返回给对应的生产者,生产者通过监听就能拿到消息

  rabbitTemplate.setMandatory(true);

        //编写returnCallBack回调函数

  rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback(){

            @Override

            //匿名内部类

 /**

 * returnedMessage有五个参数 下面一一说明

 * Message message 消息对象

 * int replyCode    返回编码 错误码

 * String replyText 错误信息

 * String exchange  交换机

 * String routingKey 路由键

 **/

  public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {

                System.out.println( "返回模式的回调函数被执行了!" );

                System.out.println( "消息对象:" +message);

                System.out.println( "返回编码(错误码):" +replyCode);

                System.out.println( "错误信息:" +replyText);

                System.out.println( "交换机:" +exchange);

                System.out.println( "路由键:" +routingKey);

                //将来会做处理 把信息重新路由



 //-----------------------------------------打印信息

 //返回模式的回调函数被执行了!

 //消息对象:(Body:'message confirm...' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, deliveryTag=0])

 //返回编码(错误码):312

 //错误信息:NO_ROUTE

 //交换机:test_exchange_confirm

 //路由键:confirm111

 }



        });

        //发送消息

  rabbitTemplate.convertAndSend( "test_exchange_confirm" , "confirm" , "message confirm..." );

    }



    //专门测试限流循环发送消息

 @Test

    public void testSend() {

        for (int i = 0; i < 10; i++) {

            //发送消息

  rabbitTemplate.convertAndSend( "test_exchange_confirm" , "confirm" , "message confirm..." );

        }

    }



    //测试ttl

 /**

 *  ttl 过期时间分为两种

 *  1队列统一过期

 *  2消息单独过期

 *  如果设置了消息的过期时间,也设置了队列的过期时间,它以时间短的为准!

 *  如果队列过期后,会将队列所有消息全部移除,因为是统一的

 *  消息过期后,只有消息在队列顶端(快要被消费),才会判断其是否过期,如果过期就会被移除掉

 **/

 @Test

    public void testTTL() {

        //消息单独过期 在convertAndSend方法中心新增一个参数 MessagePostProcessor 加载匿名内部类和它的重写方法

 //MessagePostProcessor 消息处理对象 设置一些消息参数信息



 //发送消息

  for (int i = 0; i < 10; i++) {

            if(i==5){

                //过期的消息

  rabbitTemplate.convertAndSend( "test_exchange_ttl" , "ttl.weiyihe" , "message ttl..." ,new MessagePostProcessor(){

                    @Override

                    public Message postProcessMessage(Message message) throws AmqpException {

                        //设置message的信息  setExpiration 设置消息过期时间

 message.getMessageProperties().setExpiration( "10000" );

                        //返回该消息

  return message;

                    }

                });

            }else{

                //不过期的消息

  rabbitTemplate.convertAndSend( "test_exchange_ttl" , "ttl.weiyihe" , "message ttl..." );

            }

        }

    }





    /**

 * 发送测试私信消息

 * 1、消息过期时间的测试

 * 2、队列长度限制的测试

 * 3、消费者消息拒收的限制

 **/

 @Test

    public void testDlx(){

        //1、测试过期时间的死信 给正常的交换机发送消息

 //如果消息正常发送到正常的交换机,过了10s会自动去死信队列

 //发送消息

 //rabbitTemplate.convertAndSend("test_exchange_dlx", "test.dlx.haha", "我是一条消息,我会死吗?");



 //2、队列长度限制的测试

 //发送20条信息 现在x-max-length是10

 //如果发送成功 那么因为设置了最大长度是10,只会有10条进行正常队列

 // 剩下的会跑到死信队列,过了10s后正常队列中的消息也会自动跑到死信队列中

 //for (int i = 0; i < 20; i++) {

 //    //发送消息

 //    rabbitTemplate.convertAndSend("test_exchange_dlx", "test.dlx.haha", "我是一条消息,我会死吗?");

 //}



 //3 消费者消息拒收的限制

 //消费者Consumer监听正常的队列,然后让消息拒绝接收并且不重回队列

  rabbitTemplate.convertAndSend( "test_exchange_dlx" , "test.dlx.haha" , "我是一条消息,我会死吗?" );



    }

}
复制代码

消费者拒收消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.wyh.listener;



import com.rabbitmq.client.Channel;

import org.springframework.amqp.core.Message;

import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;

import org.springframework.stereotype.Component;



import java.util.concurrent.TimeUnit;



 /**

 *  @program:  SpringBoot_RabbitMQ_Advanced

 *  @description:  RabbitMQ 死信通信

 *  @author:  魏一鹤

 *  @createDate:  2022-04-06 20:30

 **/



 //包扫描注解 把bean加载到spring容器中

@Component

 //实现MessageListener接口并重写onMessage方法

public class DLXCKListener implements ChannelAwareMessageListener {



    @Override

    public void onMessage(Message message, Channel channel) throws Exception {

        long deliveryTag = message.getMessageProperties().getDeliveryTag();

        try {

            //1 接收并打印消费者收到(消费)的消息

 System.out.println(new String(message.getBody()));

            //2 处理业务逻辑

 System.out.println( "处理业务逻辑......" );

            //故意使得业务报错

  int num=3/0;

            channel.basicAck(deliveryTag,true);

        } catch (Exception e) {

            System.out.println( "出现异常,消费者拒绝签收!" );

            //死信队列 拒绝签收requeue=false 将消息路由到死信队列中

 channel.basicNack(deliveryTag,true,false);



        }

    }

}
复制代码
DLX小结

1 死信交换机(队列)和普通交换机(队列)没什么区别

2 当消息成为死信后,如果该队列绑定了死信队列,那么该消息就会被死信交换机路由到死信队列,如果没有绑定死信队列,那么消息就会根据消息过期时间丢失,就不会被消费

成为死信队列的三种情况

1 队列消息长度达到最大限制

2 消息者拒收消息,并且不允许重回路由

3 原队列设置过期时间,消息到达超时时间未被消费

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年11月 Java教学课程 205-RabbitMQ(高级特性)
RabbitMQ是一个功能强大的开源消息中间件,除了基础的消息队列功能,还提供了许多高级特性,RabbitMQ的高级特性主要有:
愚公搬代码
2025/06/02
490
【愚公系列】2023年11月 Java教学课程 205-RabbitMQ(高级特性)
15-RabbitMQ高级特性-死信队列
死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。
Devops海洋的渔夫
2023/02/10
1K0
15-RabbitMQ高级特性-死信队列
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
Java廖志伟
2022/03/07
7910
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列
目前有俩种方式可以设置消息的TTL 一是设置队列的TTL,队列中所有消息都有相同的过期时间.
用户11369558
2024/11/25
6920
【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列
16-RabbitMQ高级特性-延迟队列
16-RabbitMQ高级特性-延迟队列 延迟队列 延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。 需求: 下单后,30分钟未支付,取消订单,回滚库存。 新用户注册成功7天后,发送短信问候。 实现方式: 对于上面两种需求,一般有两种实现方式: 定时器 延迟队列 定时器:设置一个轮询时间,间隔一段时间对数据库进行扫描对比,当符合定时的数据则进行处理; 缺点: 不优雅,因为不管设置多少间隔时间,都会对数据库产生多次扫描的执行,影响性能; 而且间隔的时间范围对具体时间点存在一定的误差
Devops海洋的渔夫
2023/02/10
6520
16-RabbitMQ高级特性-延迟队列
RabbitMQ高级特性之延迟队列
很多时候我们想定时去做某件事情的时候我们会首先想到定时任务,quartz是个不错的选择,但是也有缺点,假如配置在项目中,集群部署会有重复执行的问题,如果持久化在mysql中,解决了集群的问题,但是过于依赖mysql,耦合严重,当然还有日志量庞大、执行时间精度、过于耗费系统资源等等问题。所以这时候使用消息队列中间件的的延时队列就是一个很好得解决方案,我们设置要触发消费的时间和必要的参数入队mq,到时监听queue的消费者自然拿到消息然后去走业务流程,这里介绍的是基于rabbitmq中间件实现的TTL版的延时队列。
黎明大大
2021/03/25
1.2K0
RabbitMQ高级特性之延迟队列
Rabbit 高级操作
过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了时间之后消息将自动被删除。
张小驰出没
2021/12/06
4080
Rabbit 高级操作
java消息队列基础和RabbitMQ相关概念
在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式用来控制消息的投递可靠性模式。
终有救赎
2023/10/16
2730
java消息队列基础和RabbitMQ相关概念
近九万字的RabbitMQ图文详解
RabbitMQ 简介:RabbitMQ 基于 AMQP 标准,采用 Erlang 语言开发的消息中间件。
Java廖志伟
2022/03/07
1.1K0
近九万字的RabbitMQ图文详解
RabbitMQ & 死信队列DLX & TTL+DLX实现延迟队列
Dead Letter Exchange 死信交换机(RabbitMQ叫死信队列)
收心
2022/09/23
5510
RabbitMQ & 死信队列DLX & TTL+DLX实现延迟队列
03、RabbitMQ延迟队列(死信交换机)
天蝎座的程序媛
2023/10/17
2980
03、RabbitMQ延迟队列(死信交换机)
RabbitMQ的死信队列
RabbitMQ的死信队列(Dead Letter Queue,简称DLQ)是一种用于处理消息失败或无法路由的消息的机制。在RabbitMQ中,当消息出现以下情况时,它可能会被标记为死信:
会洗碗的CV工程师
2024/05/03
1.3K0
RabbitMQ的死信队列
RabbitMQ之死信队列解读
主启动类RabbitMq01Application:实现ApplicationRunner接口
一个风轻云淡
2023/10/12
8350
分布式--RabbitMQ集成SpringBoot、消息可靠性、死信队列、延迟交换机、集群
SpringBoot中使用RabbitTemplate自动注入,即可发送消息,并对方法都进行了封装
aruba
2022/09/19
6250
分布式--RabbitMQ集成SpringBoot、消息可靠性、死信队列、延迟交换机、集群
【云原生进阶之PaaS中间件】第四章RabbitMQ-4.1-原理机制与进阶特性
4.客户端使用Routing key,在Exchange和Queue之间建立好绑定关系。
江中散人_Jun
2024/02/20
3870
【云原生进阶之PaaS中间件】第四章RabbitMQ-4.1-原理机制与进阶特性
RabbitMq TTL+死信队列 延迟消息问题记录
原因是尽管ttl是设给每条消息的。但是本质上,所有延时消息都还在一个队列里,对它过期时间的检测也是从头部开始的。
Java king
2023/02/21
1.4K0
RabbitMQ实现延时队列(死信队列)
TTL是time to live 的简称,顾名思义指的是消息的存活时间。rabbitMq可以从两种维度设置消息过期时间,分别是队列和消息本身。 队列消息过期时间-Per-Queue Message TTL: 通过设置队列的x-message-ttl参数来设置指定队列上消息的存活时间,其值是一个非负整数,单位为微秒。不同队列的过期时间互相之间没有影响,即使是对于同一条消息。队列中的消息存在队列中的时间超过过期时间则成为死信。
Java_老男孩
2019/12/02
2.2K0
RabbitMQ---延迟队列,整合springboot
延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。
大忽悠爱学习
2021/12/07
6730
RabbitMQ---延迟队列,整合springboot
rabbitMQ结合spring-boot使用(2).md
这一章节我们会学习rabbitMQ在项目生产中一些重要的特性,如持久化,消息确认机制,消息过期等特性。只要能利用好这些特性,我们就能开发出可用性强的,功能强大的MQ系统。
六个核弹
2022/12/23
4010
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】
在编写现代应用时,我们经常需要处理异步消息。而当这些消息发生异常或者需要延迟处理时,RabbitMQ的死信队列就像一把神奇的钥匙,为我们打开了新的可能性。本文将带你踏入Spring Boot和RabbitMQ的奇妙世界,揭示死信队列的神秘面纱。
一只牛博
2025/05/31
1050
推荐阅读
相关推荐
【愚公系列】2023年11月 Java教学课程 205-RabbitMQ(高级特性)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验