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

时间:2015-05-12 21:28:07

标签: php symfony rabbitmq amqp

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

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

脚本基本上做的是从队列中挑选一个项目,提取应该抓取的URL然后抓取它。当在已爬网页面上找到新网址时,这些网址将作为新作业发布到队列中。

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

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

总是在处理大约30个网址时。

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

  • 注册多个渠道(一个用于发布的渠道,一个用于消费的渠道)
  • 玩交付模式和durabillity

如果谷歌出现此错误,很多人会说你在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

不知何故,频道似乎已经关闭,不应该发生这种情况。

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

1 个答案:

答案 0 :(得分:2)

我在几天前找到了原因和解决方案,即使我是'#34;肯定"我没有两次承认,我仍然是:)

原因:

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块中移动确认调用。