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個屬性不一致的隊列
相關文章
相關標籤/搜索