1. NOT_ALLOWED - access to vhost '/' refused for user 'test'
https://blog.csdn.net/u010889616/article/details/80644225
定位發現是連接rabbitmq使用的用戶沒有賦予訪問權限
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
https://www.cnblogs.com/linkenpark/p/5393666.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的,唯一的辦法就是刪除這個隊列然后重現創建。因此,最好仔細檢查創建的標志。
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類型的交換器時,如果你的死信隊列指定的死信交換器是該交換器,消息存在發送到多個隊列的風險,會對別的系統造成重復消費。
2.max retry如何獲取,rabbitmq有一個屬性,就是當一個消息進入到死信隊列時,消費者收到的AMQP.BasicProperties參數中的headers屬性中的cout參數就會加1,利用這個屬性我們可以獲取到該消息被消費了多少次。代碼:
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個屬性不一致的隊列