rabbitmq死信队列

编程

简介

DLX 全称为 Dead Letter Exchange, 可以称为死信交换器,当消息在一个队列中变成死信之后,他能被重新发送到另一个交换器中,这个交换器

就是DLX, 绑定到 DLX 上的队列称为"死信队列",DLX 也是一个正常的交换器,和一般的交换器没有区别,可以在任何队列上指定,实际上就是队

列的一个属性,当这个队列存在死信的时候, RabbitMQ 会自动把这个消息重新发布到 DLX 上,进而路由到死信队列,可以监听这个队列,做相应

的处理,例如实现延迟队列的功能

消息变成死信的条件

  1. 消息被拒绝(使用 Basic.Reject或者 Basic.Nack),并且设置 requeue 为 false
  2. 消息过期
  3. 队列达到最大长度

可以通过在 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

回到顶部