当RabbitMQ由于磁盘级别或内存水印警报而开始阻止连接时,我正在尝试构建有意义的代码来处理这种情况。
可以添加有关将连接设置为阻止模式的通知的处理程序。
然而,似乎只有当我试图关闭连接时才会发送此通知。
所以运行
$this->channel->basic_publish($msg, $this->exchangeName, $route);
执行成功,处理程序未收到有关连接被阻止的通知。
同时,消息并没有添加到队列中——我可以从仪表板中判断出来。
但当我试图明确关闭连接时:
$this->channel->close();
或者隐式地(通过让脚本完成,AMQP对象析构函数完成其余操作)我收到通道被阻塞的通知,在该脚本冻结之后,据我所知,它等待一些数据来完成close_ok方法。
所以问题是如何在发布时(或发布后)获得被屏蔽频道的信息?如何避免脚本在被阻止的连接上永远等待?
提前谢谢。
好吧,看起来我有了答案。
RabbitMQ向活动连接发布通知。
所以,若我尝试创建到遇到内存或磁盘问题的服务器的连接,那个么这些通知根本并没有帮助。
但若连接是活动的,那个么在我尝试发布消息之后,关于阻塞的通知就会到达,这是应该的
现在我只需要弄清楚如何检测服务器在创建新连接的阶段遇到的问题。但这是另一个问题。