美文网首页
死信队列

死信队列

作者: qyfl | 来源:发表于2019-09-26 22:25 被阅读0次

    Dead-Letter-Exchange,DLX
    当一个消息在一个队列中变成死信之后,它能被重新推送到另一个 Exchange,这个 Exchange 就是 DLX。

    消息变成死信的情况:

    • 消息被拒绝
    • 消息 TTL 过期
    • 队列达到最大长度。

    死信队列也是一个正常的队列,只是其他队列里的消息变成死信的时候,往这个队列转发。
    转发的配置,需要在其他的队列上进行配置。

    import com.rabbitmq.client.*;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.TimeoutException;
    
    public class Consumer {
        public static void main(String[] args) throws IOException, TimeoutException {
            // 1. 创建一个 ConnectionFactory,并配置
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("127.0.0.1");
            connectionFactory.setPort(5672);
            connectionFactory.setVirtualHost("/");
    
            // 2. 通过连接工厂创建连接
            Connection connection = connectionFactory.newConnection();
    
            // 3. 通过 connection 创建 Channel
            Channel channel = connection.createChannel();
    
    
            Map<String,Object> arguments = new HashMap<String,Object>();
            arguments.put("x-dead-letter-exchange","dlx.exchange");
    
            // 4. 声明一个队列
            String queueName = "test001";
            String exchangeName = "test_qos_exchange";
            String routingKey = "qos.#";
            channel.queueDeclare(queueName, true, false, false, arguments);
            channel.exchangeDeclare(exchangeName, "topic", true, true, null);
            channel.queueBind(queueName, exchangeName, routingKey);
    
            // 5. 声明一个死信队列
            channel.queueDeclare("dex.queue", true, false, false, null);
            channel.exchangeDeclare("dlx.exchange", "topic", true, false, null);
            channel.queueBind("dex.queue", "dlx.exchange", "#");
    
            // 6. 创建消费者
            QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
    
            // 7. 设置 Channel
            channel.basicQos(0,1,false);
            channel.basicConsume(queueName, false, new myComsumer(channel));
        }
    }
    

    相关文章

      网友评论

          本文标题:死信队列

          本文链接:https://www.haomeiwen.com/subject/rwvquctx.html