• RabbitMQ学习10死信队列(队列达到最大长度)


    队列可以设置最大接受信息的长度,如果等待被消费而排队的消息的数量,大于这个长度,就会转发给死信队列。

    1、生产者代码:

     1 package com.yas.deadexchange;
     2 
     3 import com.rabbitmq.client.AMQP;
     4 import com.rabbitmq.client.BuiltinExchangeType;
     5 import com.rabbitmq.client.Channel;
     6 import com.yas.config.RabbitMQClient;
     7 import org.junit.Test;
     8 
     9 public class Publisher_MaxLength {
    10     private static final String NORMAL_EXCHANGE = "normal_exchange";
    11 
    12     @Test
    13     public void publish() throws Exception {
    14         try (Channel channel = RabbitMQClient.getChannel()) {
    15             channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
    16             //设置消息的 TTL 时间
    17             //AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();
    18             //该信息是用作演示队列个数限制
    19             for (int i = 1; i <11 ; i++) {
    20                 String message="info"+i;
    21                 //channel.basicPublish(NORMAL_EXCHANGE, message.getBytes());
    22                 channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",null,message.getBytes());
    23                 System.out.println("生产者发送消息:"+message);
    24             }
    25         }
    26     }
    27 }

    2、普通队列消费者代码:

     1 package com.yas.deadexchange;
     2 
     3 import com.rabbitmq.client.BuiltinExchangeType;
     4 import com.rabbitmq.client.Channel;
     5 import com.rabbitmq.client.Connection;
     6 import com.rabbitmq.client.DeliverCallback;
     7 import com.yas.config.RabbitMQClient;
     8 import org.junit.Test;
     9 
    10 import java.util.HashMap;
    11 import java.util.Map;
    12 
    13 public class Consumer_MaxLength {
    14     public static final String NORMAL_EXCHANGE = "normal_exchange";
    15     public static final String DEAD_EXCHANGE = "dead_exchange";
    16     public static final String NORMAL_QUEUE = "normal_queue";
    17     public static final String DEAD_QUEUE = "dead_queue";
    18 
    19     @Test
    20     public void consume() throws Exception {
    21         //1.获取连接对象
    22         Connection connection = RabbitMQClient.getConnection();
    23         //2.创建channel
    24         Channel channel = connection.createChannel();
    25 
    26         //声明死信交换机 类型为 direct
    27         channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
    28         //声明死信队列
    29         channel.queueDeclare(DEAD_QUEUE, false, false, false, null);
    30         //死信队列绑定死信交换机与 routingkey
    31         channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "lisi");
    32 
    33 
    34         //声明普通交换机 类型为 direct
    35         channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
    36         //正常队列绑定死信队列信息
    37         Map<String, Object> params = new HashMap<>();
    38         //正常队列设置死信交换机 参数 key 是固定值
    39         params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
    40         //正常队列设置死信 routing-key 参数 key 是固定值
    41         params.put("x-dead-letter-routing-key", "lisi");
    42 
    43         //正常队列设置最大长度
    44         params.put("x-max-length",6);
    45 
    46         //声明普通队列
    47         channel.queueDeclare(NORMAL_QUEUE, false, false, false, params);
    48         //普通队列绑定普通交换机routing-key
    49         channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "zhangsan");
    50         System.out.println("等待接收消息........... ");
    51 
    52         //消费者回调
    53         DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    54             String message = new String(delivery.getBody(), "UTF-8");
    55             System.out.println("Consumer01 接收到消息"+message);
    56             };
    57         channel.basicConsume(NORMAL_QUEUE, true, deliverCallback, consumerTag -> {
    58         });
    59 
    60         System.in.read();
    61         //5/释放资源
    62         channel.close();
    63         connection.close();
    64     }
    65 }

    3、测试:

    启动生产者,但不启动消费者。会发送10个消息。其中6个消息在普通队列中排队,而4个消息会被转发到死信队列中。

    使用普通队列的消费者,只能消费调这6条普通队列中的消息。

    通过死信队列的消费者,才能消费调私信队列中的消息。

  • 相关阅读:
    剑指offer---链表中倒数第k个结点
    剑指offer---反转链表
    剑指offer---从尾到头打印链表
    数据结构---链表ADT C++实现
    ubuntu解压zip文件出现乱码情况解决方法
    Ubuntu终端常用的快捷键(转载)
    requsets模块的学习
    爬虫的基本知识
    谈谈我们对userAgent的看法,为什么爬虫中需要userAgent?
    git的基本使用
  • 原文地址:https://www.cnblogs.com/asenyang/p/15519143.html
Copyright © 2020-2023  润新知