参考:<
Dead-Letter-Exchange,简称DLX,可称为死信交换器、死信邮箱等等。
当消息在一个队列中变成死信(dead message)之后,它能被重新发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就称之为死信队列。
消息变成死信的几种情况:
注:
示例:
声明了两个交换器 dlxExchangeName和normalExchangeName,分别绑定了两个队列dlxQueue和normalQueue。发送消息流程:
...
// 死信交换器、队列
channel.exchangeDeclare(dlxExchangeName, "direct", true);
channel.queueDeclare(dlxQueueName, true, false, false, null);
channel.queueBind(dlxQueue, dlxExchangeName, dlxRoutingKey);
// 普通交换器、队列
channel.exchangeDeclare(normalExchangeName, "direct", true);
Map<String, Object> arguments = new HashMap<>(4);
arguments.put("x-message-ttl", 5000);// 设置消息过期时间
arguments.put("x-dead-letter-exchange", dlxExchangeName);// 为普通队列添加DLX
arguments.put("x-dead-letter-routing-key", dlxRoutingKey);// 为这个DLX指定路由键,不指定则使用原队列的路由键
channel.queueDeclare(queueName, true, false, false, arguments);
channel.queueBind(normalQueue, normalExchangeName, normalRoutingKey);
byte[] content = "Test Msg".getBytes("UTF-8");
channel.basicPublish(normalExchangeName, normalRoutingKey, false, null, content);
...
x-dead-letter-routing-key
这个属性(1)声明交换器、队列
和原生api一样,在声明队列时指定DLX,通过设置消息过期时间模拟。
@Bean
public DirectExchange dlxNormalExchange() {
return new DirectExchange(normalExchangeName);
}
@Bean
public Queue dlxNormalQueue() {
Map<String, Object> args = new HashMap<>(4);
// 设置消息过期时间
args.put("x-message-ttl", 5000);
// 为普通队列添加DLX
args.put("x-dead-letter-exchange", dlxExchangeName);
// 为这个DLX指定路由键,不指定则使用原队列的路由键
args.put("x-dead-letter-routing-key", dlxRoutingKey);
return new Queue(normalQueueName, true, false, false, args);
}
@Bean
Binding bindingDlxNormalQueue(Queue dlxNormalQueue, DirectExchange dlxNormalExchange) {
return BindingBuilder.bind(dlxNormalQueue).to(dlxNormalExchange).with(normalRoutingKey);
}
@Bean
public DirectExchange dlxExchange() {
return new DirectExchange(dlxExchangeName);
}
@Bean
public Queue dlxQueue() {
// true 持久化
return new Queue(dlxQueueName, true);
}
@Bean
Binding bindingDlxQueue(Queue dlxQueue, DirectExchange dlxExchange) {
return BindingBuilder.bind(dlxQueue).to(dlxExchange).with(dlxRoutingKey);
}
(2)测试发送消息
正常发送消息即可,不需要设置其他消息属性。
springboot-rabbitmq-demo测试代码:https://github.com/mytt-10566/springboot-rabbitmq-demo