RabbitMq高级特性之死信队列 通俗易懂 超详细 内含案例
Posted beixuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMq高级特性之死信队列 通俗易懂 超详细 内含案例相关的知识,希望对你有一定的参考价值。
RabbitMq高级特性之死信队列 又称 死信交换机 DLX
当消息成为 Dead message 后,会重新发送到另一个交换机,这个交换机就是 DLX
消息成为死信的情况公有三种:
- 队列消息长度达到限制
- 消费者拒接消费消息 basicNack/basicReject,并且不把消息重新放回原目标队列,requeue=false;
- 原队列消息存在消息过期设置,消息达到过期时间
前提
一、更改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();
}
}
二、测试
- 如有topic_queue已存在,请删除
- 执行ProducerTest.java单元测试
- 过期的死信队列会跑到DLX_QUEUE队列中
三、小结
- 死信队列也可以创建一个消费者来消息死信消息
- 可以在RabbitMqConfig.java文件中的itemQueue()方法中设置队列的最大限度,QueueBuilder.maxLendth(5); 当出入大于5个消息,多余的会丢到死信队列中
- channel.basicNack(deliveryTag, true, false);确认消息但是不发送回原目标队列,会丢到死信队列中
以上是关于RabbitMq高级特性之死信队列 通俗易懂 超详细 内含案例的主要内容,如果未能解决你的问题,请参考以下文章
RabbitMq高级特性之TTL 存活时间/过期时间 通俗易懂 超详细 内含案例
RabbitMq高级特性之消费端限流 通俗易懂 超详细 内含案例