PHP ampq + Rabbit MQ –运行时间长的生产者:可以将消息发送到已经声明的队列,但是不能声明新的队列

时间:2019-06-07 06:06:41

标签: php rabbitmq php-amqplib

我有一个应该一直运行的“生产者”,但是似乎经过一天左右的时间,它仍然能够向先前声明的队列发送消息,但是当尝试声明一个新队列时,它炸毁:

'PhpAmqpLib\Exception\AMQPHeartbeatMissedException' with message 'Missed server heartbeat' in /php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/AbstractIO.php:140

我认为心跳仅适用于消费者(因为没有地方检查生产者的心跳)?当我不是“消费者”时是否正在检查心跳是一个错误?

还是在我声明队列时,我的脚本也变成了“消费者”,因为它需要“消费”来自服务器的反馈,表明该队列已准备就绪或可以使用?

当前设置的方式,我可以定期使用什么解决方法来检查queue_declare是否在运行时会崩溃,所以当我确实需要运行queue_declare时,它不会意外炸毁?

我在最新版本(2.9.2)上使用AMQPSSLConnection,并且$connection->isConnected()一直在返回true。心跳设置为15秒。

1 个答案:

答案 0 :(得分:1)

事实证明,php-amqplib的下一个次要版本将添加一种方法:$connection->checkHeartBeat();(在我发布此问题前几天,它就提交给了项目仓库)。定期拨打此电话即可解决问题。

与此同时,定期调用$connection->wait(null, true);也是可行的解决方案。