死信队列
DLX, 全称为 Dead-Letter-Exchange,也称之为死信交换器,也有人称为死信邮箱。
当消息在一个队列中变成死信之后,它能被重新的发送到另外一个交换器中,这个交换器就是DLX, 绑定DLX的队列就是死信队列。
DLX也是一个正常的交换器,和其他一般的交换器没有区别,它能在任何队列上被指定。当这个队列上存在死信时,RabbitMQ会自动地将 这个消息重新发布设置的DLX上去,进而被路由到另外一个队列,即死信队列,可以监听这个队列中的消息以相应的处理。
消息一般变成死信的原因:
- 消息被拒绝(Basic.Reject/ Basic.Nack),并且设置为 false
- 消息过期
- 队列达到最大长度
package com.song.songvue.config.message;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;
/**
* 生产者客户端代码
*/
public class RabbitProducer {
private static final String IP_ADDRESS = "172.16.200.239";
private static final int PORT = 5672;
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
factory.setUsername("root");
factory.setPassword("123456");
// 创建连接
Connection connection = factory.newConnection();
// 创建信道
Channel channel = connection.createChannel();
channel.exchangeDeclare("exchange.normal","fanout",true,false,null);
// 死信交换器
channel.exchangeDeclare("exchange.dlx","direct",true,false,null);
// 死信队列
channel.queueDeclare("queue.dlx",true,false,false,null);
// 队列绑定
channel.queueBind("queue.dlx","exchange.dlx","routingKey");
Map<String, Object> params = new HashMap<>();
// 设置消息过期时间
params.put("x-message-ttl",10000);
// 设置死信发布的DLX
params.put("x-dead-letter-exchange","exchange.dlx");
params.put("x-dead-letter-routing-key","routingKey");
channel.queueDeclare("queue.normal",true,false,false, params);
channel.queueBind("queue.normal","exchange.normal","");
String message = "dead letter message";
channel.basicPublish("exchange.normal","rk",MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
channel.queueDeclare("song",true,false,false,null);
// 关闭资源
channel.close();
connection.close();
System.out.println(" [x] Send '" + message + "'");
}
}