RabbitMQ遇到的坑

1. NOT_ALLOWED - access to vhost '/' refused for user 'test'

https://blog.csdn.net/u010889616/article/details/80644225php

定位发现是链接rabbitmq使用的用户没有赋予访问权限
html

rabbitmqctl.bat set_permissions -p / test '.*' '.*' '.*'

2. queue_declare 参数详解

  • queue_declare ()不带参数方法默认建立一个由RabbitMq命名的(amq.gen-LHQZz...)
    名称,这种队列也称之为匿名队列,排他 的,自动删除的,非持久化的队列
  • queue:队列名称
  • passive:若是用户仅仅想查询某一个队列是否已存在,若是不存在,不想创建该队列,仍然能够调用queue.declare,只不过须要将参数passive设为true,传给queue.declare,若是该队列已存在,则会返回true;若是不存在,则会返回Error,可是不会建立新的队列。
  • durable: 是不持久化, true ,表示持久化,会存盘,服务器重启仍然存在,false,非持久化
  • exclusive : 是否排他的,true,排他。若是一个队列声明为排他队列,该队列公对首次声明它的链接可见,并在链接断开时自动删除,
  • auto_delete :是否自动删除,true,自动删除,自动删除的前提:至少有一个消息者链接到这个队列,以后全部与这个队列链接的消息都断开时,才会自动删除,备注:生产者客户端建立这个队列,或者没有消息者客户端链接这个队列时,不会自动删除这个队列
  • arguments:其它一些参数。如:x-message-ttl,之类

https://www.jianshu.com/p/5634a9c71559
http://www.javashuo.com/article/p-sahvupop-hq.html服务器

3. inequivalent arg 'durable' for exchange 'delay_exchange' in vhost '/': received 'false' but current is 'true'

RabbitMQ 不容许你绑定一个非坚固(non-durable)的交换机和一个durable的队列。反之亦然。要想成功必须队列和交换机都是durable的。

一旦建立了队列和交换机,就不能修改其标志了。例如,若是建立了一个non-durable的队列,而后想把它改变成durable的,惟一的办法就是删除这个队列而后重现建立。所以,最好仔细检查建立的标志。app

4. https://blog.csdn.net/wangzhan0123/article/details/80922327

1.normal_exchange_delay和normal_queue_delay是死信队列,设置了队列属性x-message-ttl的属性,即指定了延时时间,达到x-message-ttl设置的时间未消费的就会自动路由到normal_exchange_requeue交换器,从而实现了延迟重试。这里须要解释的是为何要从新建立一个新的交换器normal_exchange_requeue:由于当你的normal_exchange绑定多个队列,且是topic类型的交换器时,若是你的死信队列指定的死信交换器是该交换器,消息存在发送到多个队列的风险,会对别的系统形成重复消费。ui

2.max retry如何获取,rabbitmq有一个属性,就是当一个消息进入到死信队列时,消费者收到的AMQP.BasicProperties参数中的headers属性中的cout参数就会加1,利用这个属性咱们能够获取到该消息被消费了多少次。代码:.net

private function getRetryCount(AMQPMessage $msg): int
    {
        $retry = 0;
        Log::info('xx', [$msg->has('application_headers')]);
        if ($msg->has('application_headers')) {
            $headers = $msg->get('application_headers')->getNativeData();
            if (isset($headers['x-death'][0]['count'])) {
                $retry = $headers['x-death'][0]['count'];
            }
        }

        return (int)$retry;
    }

5. 声明队列报错:PhpAmqpLib\Exception\AMQPProtocolChannelException: PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'normal_queue' in vhost '/': received the value '30000' of type 'signedint' but current is none in file 。。。

缘由:queue已经存在,可是启动 consumer 时试图设定一个 x-dead-letter-exchange 参数,这和服务器上的定义不同,server 不容许因此报错。若是删除 queue 从新 declare 则不会有问题。或者经过 policy 来设置这个参数也能够不用删除队列。也就是同时声明了2个属性不一致的队列
相关文章
相关标签/搜索