rabbitmq_特别注意篇 queueDeclare

1 队列声明参数

  

  queue: 队列名字

       durable:是否持久化

      队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失队列(即便队列中有数据),如果想重启之后还存在就要使队列持久化 ( 设置durable为true ),保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库.

     (知识点补充)rabbitmq 消息持久化分为2个步骤,

        一是队列持久化, channel.queueDeclare 的 durable的值设为true;如果只设置该值,那么重启rabbitmq时队列将保存而消息消失。

        二是消息的持久化 , 消息持久化在发送消息的时候设置

          channel.basicPublish("交换机名称", "路由类型", MessageProperties.PERSISTENT_TEXT_PLAIN, "消息主体".getBytes());

          MessageProperties.PERSISTENT_TEXT_PLAIN 就是设置消息持久化

       如果只设置消息持久化,那么重启rabbitmq时队列和消息都会消失,只有同时设置了队列持久化和消息持久化,消息才会保存。就算是这样消息也不是100%持久化成功的。

 

  autoDelete

     当最后一个消费者断开连接之后队列是否自动被删除,可以通过RabbitMQ Management,查看某个队列的消费者数量,当consumers = 0时队列就会自动删除.

     注意: 如果生产者声明了一个queue,此队列从来没有消费者连接过,那么 即使consumers = 0,队列也不会自动删除的

  exclusive:是否排外

    有两个作用,

       一:当连接关闭时connection.close()该队列会自动删除;

              举个例子: 如果一个排外队列由生产者声明, 如果没有消费者或者没有消费完,在队列中存在数据的情况下,生产者断开连接的话,队列中的数据和队列依旧会删除(即:会丢数据)

      二:exclusive参数声明为true的排他队列是基于连接(Connection)可见的,是该Connection私有的。同个连接Connection的不同管道Channel是可以访问同一个排他队列的;同理,两个消费者如果get的是同一个Connection(用单例模式实现),那么这两个消费者也是可以共享这个排他队列的

    特别注意 :如果队列是排外的,会对当前队列加锁,非同一个Connection的通道channel是不能访问的,如果强制访问会报异常:com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=405, reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'queue_name' in vhost '/', class-id=50, method-id=20),一般来说 ,exclusive等于true的话用于一个队列只能有一个消费者来消费的场景

      一般排外队列由消费者声明,因为消费者是持续监听的(个人理解)

      其他优秀博客截图:

    

  noWait:是否等待服务器返回

  args

    

 

    args里面参数的功能很丰富,主要有以下几种 (上图参数与下面参数一一对应)

    x-message-ttl:  发送到队列的消息可以存活多长时间(毫秒)。简单来说,就是队列中消息的过期时间

    x-expires: 队列在被自动删除(毫秒)之前可以存活多长时间。简单来说,就是队列的过期时间

    x-max-length: 队列中可以存储处于ready状态的消息数量。简单来说,就是队列最多可以容纳多少条消息,超出部分从头部开始删除

    x-max-length-bytes:  队列中可以存储处于ready状态的消息占用的内存空间,单位:字节

    x-overflow:

          队列溢出行为,这将决定当队列达到设置的最大长度或者最大的存储空间时发送到消息队列的消息的处理方式;
          有效的值是:
            drop-head(删除queue头部的消息)、
            reject-publish(最近发来的消息将被丢弃)、
            reject-publish-dlx(拒绝发送消息到死信交换器)
          类型为quorum 的queue只支持drop-head;

    x-dead-letter-exchange : 设置死信交换机的名称

    x-dead-letter-routing-key :设置死信交换机的路由键名称。如果未设置,将使用消息的原始路由密钥。

    x-max-priority:

            设置该队列中的消息的优先级最大值.发布消息的时候,可以指定消息的优先级,优先级高的先被消费.如果没有设置该参数,那么该队列不支持消息优先级功能.

            也就是说,就算发布消息的时候传入了优先级的值,也不会起什么作用.可设置0-255 ,一般设置为10即可

    x-queue-mode :

      {"x-queue-mode","lazy" }设置队列为懒人模式.该模式下的队列会先将交换机推送过来的消息(尽可能多的)保存在磁盘上,以减少内存的占用.当消费者开始消费的时候才加载到内存中;如果没有设置懒人模式,队列则会直接利用内存缓存,以最快的速度传递消息.

    x-queue-master-locator: 将队列设置为主位置模式,确定在节点集群上声明时队列主机所在的规则。

posted @ 2021-09-26 18:00  代达罗斯之殇  阅读(2294)  评论(0编辑  收藏  举报