RabbitMQ(14)RabbitMQ高级特性:死信队列

概述

死信队列,英文缩写: DLX。Dead Letter Exchange (死信交换机), 当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。如下图所示:
RabbitMQ(14)RabbitMQ高级特性:死信队列_第1张图片

消息成为死信的三种情况

1.队列消息长度到达限制;

比如说,给一个队列,设置了他最大能存储10个消息,当11条消息进来时,已经存储不下了,这条消息就会称为死信队列

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

不签收消息,并不把消息重 新放入原目标队列

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

队列绑定死信交换机

给队列设置参数: x-dead-letter-exchange 和x-dead-letter-routing-key

  1. x-dead-letter-exchange:设置交换机的名称
  2. x-dead-letter-routing-key:发送消息时指定的routingkey,就是要设置的这个参数
    RabbitMQ(14)RabbitMQ高级特性:死信队列_第2张图片

代码实现

修改spring-rabbitmq-producer.xml配置文件
spring-rabbitmq-producer.xml



    

    <rabbit:queue name="test_queue_dlx" id="test_queue_dlx">
        
        <rabbit:queue-arguments>
            
            <entry key="x-dead-letter-exchange" value="exchange_dlx" />

            
            <entry key="x-dead-letter-routing-key" value="dlx.hehe" />
			
			
            
            <entry key="x-message-ttl" value="10000" value-type="java.lang.Integer" />
            
            <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:binding>
        rabbit:bindings>
    rabbit:topic-exchange>


    

    <rabbit:queue name="queue_dlx" id="queue_dlx">rabbit:queue>
    <rabbit:topic-exchange name="exchange_dlx">
        <rabbit:bindings>
            <rabbit:binding pattern="dlx.#" queue="queue_dlx">rabbit:binding>
        rabbit:bindings>
    rabbit:topic-exchange>

测试方法

/**
     * 发送测试死信消息:
     *  1. 过期时间
     *  2. 长度限制
     *  3. 消息拒收
     */
    @Test
    public void testDlx(){
        //1. 测试过期时间,死信消息
        //rabbitTemplate.convertAndSend("test_exchange_dlx","test.dlx.haha","我是一条消息,我会死吗?");

        //2. 测试长度限制后,消息死信
       /* for (int i = 0; i < 20; i++) {
            rabbitTemplate.convertAndSend("test_exchange_dlx","test.dlx.haha","我是一条消息,我会死吗?");
        }*/

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

    }

总结

1.死信交换机和死信队列和普通的没有区别

2.当消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列

3.消息成为死信的三种情况:

  1. 队列消息长度到达限制;
  2. 消费者拒接消费消息,并且不重回队列;
  3. 原队列存在消息过期设置,消息到达超时时间未被消费;

你可能感兴趣的:(#,RabbitMQ,rabbitmq,java,分布式)