【问题标题】:RabbitMQ & php-amqplib: cunsumer reconnectRabbitMQ & php-amqplib: cunsumer 重新连接
【发布时间】:2016-09-27 09:28:21
【问题描述】:

我在 PHP 脚本中有一个消费者工作者。

但有时 RabbitMQ 服务器会停止运行,

我收到此错误:

PHP Fatal error:  Uncaught exception 'ErrorException' with message 'fwrite(): send of 19 bytes failed with errno=32 Broken pipe' in /home/user/pusher/rabbitmq-worker/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php:281

我希望能够使用 try/catch 块来处理此错误,以便向我的控制台抛出一个不错的错误或尝试在一段时间后重新连接。

这是我目前拥有的代码:

    while (true) {
try {
    $connection = new AMQPStreamConnection(RABBITMQ_HOST, RABBITMQ_PORT, RABBITMQ_USER, RABBITMQ_PASS);
    $channel = $connection->channel();
    $channel->queue_declare(RABBITMQ_DT_QUEUE, false, true, false, false);
    $channel->basic_qos(null, 11, null);
    echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

    $callback = function($req) {
     sleep(3);//Some task that takes 3 sec
     };
    $channel->basic_consume(RABBITMQ_QUEUE, '', false, false, false, false, $callback);
   while (count($channel->callbacks)) {
   $channel->wait();
    }
   $channel->close();
    $connection->close();
 } catch (Exception $e) {
sleep(1);
}

缺少什么?

【问题讨论】:

    标签: php rabbitmq


    【解决方案1】:

    定义连接的下一个参数

    keepalive: true
    heartbeat: 15 // An example
    

    AMQPStreamConnection::__constructor()的两个最新参数

    注意: 如果您连接到某个远程服务器,我建议设置较高的超时时间

    connection_timeout: 10
    read_write_timeout: 30
    

    更新: 您可以捕捉ErrorException 并尝试再次连接到服务器

    【讨论】:

    • 如果由于任何原因(甚至手动)MQ 服务器将停止/重新启动,并且不会重新连接,错误仍然存​​在
    • 当 socket 被服务器关闭或 tcp 连接中断时,你的程序无论如何都会出错
    • 注意!超时值规则:timeout >= heartbeat*2+2 rabbitmq.com/heartbeats.html#heartbeats-timeout
    • @Jekis,对。最小超时为heartbeat * 2。但是为什么+2
    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2019-12-06
    • 2016-05-13
    • 1970-01-01
    • 2018-10-10
    • 2019-02-16
    相关资源
    最近更新 更多