- Dead Letter Exchange 的缩写
- DLX也叫死信邮箱(网上的译法),死信交换机(字面翻译)。归根结底就是一个交换机,当队列中出现死信时,经过这个交换机将死信从新发送到死信队列中(指定好rabbitmq会自动发送)。
什么是死信呢?官方给出三个说法:测试
- 消息被拒绝(basic.reject或basic.nack)而且requeue=false.
- 消息TTL过时
- 队列达到最大长度(队列满了,没法再添加数据到mq中)
在定义业务队列的时候,要考虑指定一个死信交换机,死信交换机能够和任何一个普通的队列进行绑定,而后在业务队列出现死信的时候就会将数据发送到死信队列。ui
死信队列实际上就是一个普通的队列,只是这个队列跟死信交换机进行了绑定,用来存放死信而已。翻译
#####定义业务(普通)队列的时候指定参数code
x-dead-letter-exchange
: 用来设置死信后发送的交换机x-dead-letter-routing-key
:用来设置死信的routingKey
![![]rabbitmq
@Bean public Queue mailQueue() { Map<String, Object> map = new HashMap<String, Object>(); map.put("x-dead-letter-exchange", "dead_letter_exchange");//设置死信交换机 map.put("x-dead-letter-routing-key", "mail_queue_fail");//设置死信routingKey Queue queue = new Queue("mailQueue",true, false, false, map); return queue; }
@Bean public DirectExchange mailExchange() { return new DirectExchange("mailExchange", true, false); }
@Bean public Binding mailBinding() { return BindingBuilder.bind(mailQueue()).to(mailExchange()) .with(mailRoutingKey); }
@Bean public Queue deadQueue(){ Queue queue = new Queue("dead", true); return queue; }
@Bean public Binding deadLetterBindding(){ return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with("mail_queue_fail"); }
开始打算定义一个mailErrorQueue来记录消费失败的消息的,后来感受不是特别方便,用RabbitMQ自带的死信邮件机制更好一些。 DLX即死信交换机,DLK即死信路由键(routingKey)队列
当咱们消费的时候经过使用basic.reject和basic.nack便可,我这里使用的是reject。
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
图片