谈谈rabbitmq中的死信队列

文章介绍了RabbitMQ中死信消息的产生情况,包括被拒绝且不重新入队、TTL过期和队列满的情况。它还提供了一个Java代码示例,展示如何设置和使用死信交换(DLX)来处理这些死信,通过`x-dead-letter-exchange`参数指定死信队列。
摘要由CSDN通过智能技术生成
  1. 那什么消息是死信(dead message)呢?

  1. 被拒绝(basic.reject或basic.nack)并且requeue=false的消息

  1. TTL过期消息的消息

  1. 队列达到最大长度(队列满了,无法再添加数据到mq中)的消息

  1. DLX(Dead Letter Exchanges)死信队列,本身也是一个普通的消息队列,在创建队列的时候,通过设置一些关键参数x-dead-letter-exchange,可以将一个普通的消息队列设置为死信队列

  1. 当这个队列中有死信时, RabbitMQ就会自动将这个消息重新发布到设置的Exchange上去, 进而被路由到另一个队列

 package com.qiyexue.api.dlx;
 
 import com.rabbitmq.client.Channel;
 import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.ConnectionFactory;
 
 import java.util.HashMap;
 import java.util.Map;
 
 /**
  * 消费者
  *
  * @author 七夜雪
  * @date 2018-12-15 20:07
  */
 public class Consumer {
 
     public static void main(String[] args) throws Exception {
         // 1. 创建连接工厂并设置属性
         ConnectionFactory factory = new ConnectionFactory();;
         factory.setHost("192.168.72.138");
         factory.setPort(5672);
         factory.setVirtualHost("/");
 
         // 2. 创建连接
         Connection connection = factory.newConnection();
 
         // 3. 创建channel
         Channel channel = connection.createChannel();
 
         // 4. 声明死信队列Exchange和Queue
         channel.exchangeDeclare("dlx.exchange", "topic");
         channel.queueDeclare("dlx.queue", true, false, false, null);
         channel.queueBind("dlx.queue", "dlx.exchange", "#");
 
         // 5. 声明普通Exchange
         String exchangeName = "test_dlx_exchange";
         String exchangeType = "topic";
         String routingKey = "dlx.*";
         channel.exchangeDeclare(exchangeName, exchangeType, true, false, null);
 
         // 6. 声明消息队列, 指定死信队列为dlx.exchange
         String queueName = "test_dlx_queue";
         Map<String, Object> arguments = new HashMap<>();
         // x-dead-leeter-exchange属性用于指定死信队列为dlx.exchange
         arguments.put("x-dead-letter-exchange", "dlx.exchange");
         channel.queueDeclare(queueName, true, false, false, arguments);
 
         // 6. 绑定队列和Exchange
         channel.queueBind(queueName, exchangeName, routingKey);
 
    }
 
 }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值