码迷,mamicode.com
首页 > 其他好文 > 详细

RabbitMq高级特性之死信队列 通俗易懂 超详细 【内含案例】

时间:2020-07-26 01:01:14      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:cto   ext   beans   key   build   string   https   logs   code   

RabbitMq高级特性之死信队列 又称 死信交换机 DLX

当消息成为 Dead message 后,会重新发送到另一个交换机,这个交换机就是 DLX

消息成为死信的情况公有三种:

  1. 队列消息长度达到限制
  2. 消费者拒接消费消息 basicNack/basicReject,并且不把消息重新放回原目标队列,requeue=false;
  3. 原队列消息存在消息过期设置,消息达到过期时间

前提

完成 RabbitMq高级特性之TTL过期设置

一、更改RabbitMqConfig.java文件

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

/**
 * RabbitMq 配置类
 */
@Configuration
public class RabbitMqConfig {
    private static final String TOPIC_EXCHANGE_NAME = "topic_exchange";
    private static final String TOPIC_QUEUE_NAME = "topic_queue";
    
    public static final String DLX_EXCHANGE = "dlx_exchange";
    public static final String DLX_QUEUE = "dlx_queue";
    public static final String DLX_ROUTING_KEY = "dlx";


    /**
     * 创建 交换机
     * @return
     */
    @Bean
    public Exchange itemTopicExchange(){
        return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE_NAME).build();
    }
    
    @Bean
    public Exchange DlxExchange(){
        return ExchangeBuilder.directExchange(DLX_EXCHANGE).build();
    }

    /**
     * 创建 队列
     * @return
     */
    @Bean
    public Queue itemQueue(){
        //QueueBuilder.durable(TOPIC_QUEUE_NAME).withArgument("x-message-ttl",3000).build();
        //与下句代码 效果一致 写一个就可以
        //与死信交换机绑定
        return QueueBuilder.durable(TOPIC_QUEUE_NAME).ttl(3000).deadLetterExchange(DLX_EXCHANGE).deadLetterRoutingKey(DLX_ROUTING_KEY).build();
    }
    
    @Bean
    public Queue dlxQueue(){
        return QueueBuilder.durable(DLX_QUEUE).build();
    }

    /**
     * 绑定 交换机与队列
     * @param exchange
     * @param queue
     * @return
     */
    @Bean
    public Binding itemQueueExchange(@Qualifier("itemTopicExchange") Exchange exchange, @Qualifier("itemQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
    }
    
    @Bean
    public Binding itemQueueExchange(@Qualifier("dlxExchange") Exchange exchange, @Qualifier("dlxQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with(DLX_ROUTING_KEY).noargs();
    }

}

二、测试

  1. 如有topic_queue已存在,请删除
  2. 执行ProducerTest.java单元测试
  3. 过期的死信队列会跑到DLX_QUEUE队列中

三、小结

  1. 死信队列也可以创建一个消费者来消息死信消息
  2. 可以在RabbitMqConfig.java文件中的itemQueue()方法中设置队列的最大限度,QueueBuilder.maxLendth(5); 当出入大于5个消息,多余的会丢到死信队列中
  3. channel.basicNack(deliveryTag, true, false);确认消息但是不发送回原目标队列,会丢到死信队列中

RabbitMq高级特性之死信队列 通俗易懂 超详细 【内含案例】

标签:cto   ext   beans   key   build   string   https   logs   code   

原文地址:https://www.cnblogs.com/beixuan/p/13377658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!