Rabbitmq / PhpAmqpLib PRECONDITION_FAILED - 未知的交付标签

Rabbitmq / PhpAmqpLib PRECONDITION_FAILED - unknown delivery tag

我知道这个问题被问过不止一次,但这一次是不同的。

我正在使用 PhpAmqpLib(2.5.1 版)和 RabbitMq(3.5.1 版)。我创建了一个 Symfony 包,它能够抓取网站并使用工作队列在多个线程中 运行 它。

脚本的基本作用是从队列中选择一个项目,提取应该抓取的 URL 然后抓取它。当在已抓取的页面上找到新的 url 时,这些 URL 将作为新职位发布到队列中。

捆绑包位于此处:https://github.com/keesschepers/concurrent-spider-bundle

我收到以下错误:PRECONDITION_FAILED - unknown delivery tag xxx(其中 xxx 是一个变化的数字,但通常为 1、21 或 30。

总是在处理大约 30 url 时。

到目前为止我尝试了什么:

如果你 Google 这个错误,很多人会说你在 no_ack=true 时试图确认一条消息,但在我的情况下这是错误的。

谁能告诉我应该从哪里开始调试?

堆栈跟踪如下:

Exception trace:
 () at /home/vagrant/sim-search-admin/vendor/videlalvaro/php-amqplib/PhpAmqpLib/Channel/AMQPChannel.php:191
 PhpAmqpLib\Channel\AMQPChannel->channel_close() at n/a:n/a
 call_user_func() at /home/vagrant/sim-search-admin/vendor/videlalvaro/php-amqplib/PhpAmqpLib/Channel/AbstractChannel.php:170
 PhpAmqpLib\Channel\AbstractChannel->dispatch() at /home/vagrant/sim-search-admin/vendor/videlalvaro/php-amqplib/PhpAmqpLib/Channel/AbstractChannel.php:362
 PhpAmqpLib\Channel\AbstractChannel->wait() at /home/vagrant/sim-search-admin/vendor/simgroep/concurrent-spider-bundle/Queue.php:66
 Simgroep\ConcurrentSpiderBundle\Queue->listen() at /home/vagrant/sim-search-admin/vendor/simgroep/concurrent-spider-bundle/Command/CrawlCommand.php:62
 Simgroep\ConcurrentSpiderBundle\Command\CrawlCommand->execute() at /home/vagrant/sim-search-admin/vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:257
 Symfony\Component\Console\Command\Command->run() at /home/vagrant/sim-search-admin/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:882
 Symfony\Component\Console\Application->doRunCommand() at /home/vagrant/sim-search-admin/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:195
 Symfony\Component\Console\Application->doRun() at /home/vagrant/sim-search-admin/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:96
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /home/vagrant/sim-search-admin/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:126
 Symfony\Component\Console\Application->run() at /home/vagrant/sim-search-admin/app/console:28

频道似乎关闭了,这是不应该发生的。

当我在一个线程中 运行 时,这个错误已经发生了。

几天前我找到了原因和解决方案,尽管我 "sure" 我没有承认两次,但我仍然是 :)

原因:

public function theCallbackMethod(AMQPMessage $message) {
    try {
       //do something here
    } catch (ExceptionOne $e) {
        $channel->reject(/* ... */, false);
    } catch (ExceptionTwo $e) {
        $channel->reject(/* ... */, true);
    }

    $channel->acknowledge(/* ... */);
}

当然,解决方案是将确认调用移到 try catch 块中。