rabbitmq死信队列
简介
DLX 全称为 Dead Letter Exchange, 可以称为死信交换器,当消息在一个队列中变成死信之后,他能被重新发送到另一个交换器中,这个交换器就是DLX, 绑定到 DLX 上的队列称为"死信队列",DLX 也是一个正常的交换器,和一般的交换器没有区别,可以在任何队列上指定,实际上就是队
列的一个属性,当这个队列存在死信的时候, RabbitMQ 会自动把这个消息重新发布到 DLX 上,进而路由到死信队列,可以监听这个队列,做相应
的处理,例如实现延迟队列的功能
消息变成死信的条件
- 消息被拒绝(使用 Basic.Reject或者 Basic.Nack),并且设置 requeue 为 false
- 消息过期
- 队列达到最大长度
可以通过在 channel.queueDeclare 方法中设置 x-dead-letter-exchange 参数来为这个队列绑定 DLX
public class T14_dlx {
@Test
public void dlx_exchange() throws IOException, TimeoutException, InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("sun");
factory.setPassword("111111");
factory.setVirtualHost("test");
factory.setHost("192.168.32.61");
factory.setPort(5672);
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
channel.exchangeDeclare("dlx.normal.exchange", BuiltinExchangeType.DIRECT, true);
channel.exchangeDeclare("dlx.exchange", BuiltinExchangeType.DIRECT, true);
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl", 100000);
args.put("x-dead-letter-exchange", "dlx.exchange");
args.put("x-dead-letter-routing-key", "routingKey");
channel.queueDeclare("dlx_normal_queue", true, false,false, args);
channel.queueBind("dlx_normal_queue", "dlx.normal.exchange", "dlx");
channel.queueDeclare("dlx_queue", true, false, false, null);
channel.queueBind("dlx_queue", "dlx.exchange", "routingKey");
channel.basicPublish("dlx.normal.exchange", "dlx", MessageProperties.PERSISTENT_TEXT_PLAIN, "test".getBytes());
Thread.sleep(Integer.MAX_VALUE);
}
}
以上是 rabbitmq死信队列 的全部内容, 来源链接: utcz.com/z/511955.html