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个属性不一致的队列