https://blog.csdn.net/u010889616/article/details/80644225php
定位發現是鏈接rabbitmq使用的用戶沒有賦予訪問權限
html
rabbitmqctl.bat set_permissions -p / test '.*' '.*' '.*'
https://www.jianshu.com/p/5634a9c71559
http://www.javashuo.com/article/p-sahvupop-hq.html服務器
RabbitMQ 不容許你綁定一個非堅固(non-durable)的交換機和一個durable的隊列。反之亦然。要想成功必須隊列和交換機都是durable的。
一旦建立了隊列和交換機,就不能修改其標誌了。例如,若是建立了一個non-durable的隊列,而後想把它改變成durable的,惟一的辦法就是刪除這個隊列而後重現建立。所以,最好仔細檢查建立的標誌。app
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; }
緣由:queue已經存在,可是啓動 consumer 時試圖設定一個 x-dead-letter-exchange 參數,這和服務器上的定義不同,server 不容許因此報錯。若是刪除 queue 從新 declare 則不會有問題。或者經過 policy 來設置這個參數也能夠不用刪除隊列。也就是同時聲明瞭2個屬性不一致的隊列