4

我有一个应该始终运行的“生产者”,但似乎在一天左右之后,它仍然能够将消息发送到它之前声明的队列,但是当尝试声明一个新队列时,它会爆炸:

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

我以为心跳只针对消费者(因为没有地方检查生产者的心跳)?当我不是“消费者”时检查心跳是否是一个错误?

还是当我声明队列时我的脚本也成为“消费者”,因为它需要“消费”来自服务器的反馈,即队列已准备好使用或其他什么?

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

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

4

1 回答 1

5

事实证明,下一个次要版本php-amqplib将添加一个方法:($connection->checkHeartBeat();在我发布此问题的前几天,它已提交给项目 repo)。定期调用它可以解决问题。

与此同时,$connection->wait(null, true);定期打电话也是一种可行的解决方案。

于 2019-06-10T05:15:30.010 回答