RabbitMQ - 死信队列(DLX)
死信队列只是一个概念,本质就是普通的队列。给这个普通的队列指定一个用于处理满足死信条件消息的执行器和队列即可。
配置死信队列
方式1 - RabbitMQ 管理后台配置死信队列
1、创建执行器
2、创建队列
队列的属性必须要有:
死信队列执行器
x-dead-letter-exchange
死信队列路由key
x-dead-letter-routing-key
即以下两项
方式2 - 代码创建死信队列
创建死信队列
@Bean
public org.springframework.amqp.core.Queue a6DeadQueue(){
return QueueBuilder.durable(RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_DEAD_INFORMATION)
.ttl(60000)
.deadLetterExchange(RabbitMqConstant.EXCHANGE_DIRECT)
.deadLetterRoutingKey(RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_INFORMATION_ROUTING_KEY).build();
}
@Bean
public DirectExchange a6DeadExchange() {
return new DirectExchange(RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_DEAD_EXCHANGE, true, false);
}
@Bean
public Binding a6DeadBinding(org.springframework.amqp.core.Queue a6DeadQueue,DirectExchange a6DeadExchange) {
return BindingBuilder.bind(a6DeadQueue).to(a6DeadExchange).with(RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_DEAD_ROUTING_KEY);
}
消费者监听
@RabbitListener(bindings = {
@QueueBinding(
exchange = @Exchange(value = RabbitMqConstant.EXCHANGE_DIRECT, durable = "true"),
value = @Queue(
value = RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_INFORMATION, durable = "true",
arguments = {
@Argument(
name = "x-dead-letter-exchange",
value = RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_DEAD_EXCHANGE
),
@Argument(
name = "x-dead-letter-routing-key",
value = RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_DEAD_ROUTING_KEY
)
}
),
key = RabbitMqConstant.QUEUE_TB_BANK_TRANSFER_INFORMATION_ROUTING_KEY
)
})
public void consumeCustomProfile(@Payload TbBankTransferInformationMessage tbBankTransferInformationMessage, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) {
}
验证
管理后台可见队列配置
满足死信队列的条件
1、消息被拒绝
channel.basicAck(deliveryTag, false);
或
channel.basicReject(deliveryTag, false);
并且
requeue = false
2、消息TTL
3、队列达到最大长度