【问题标题】:Rabbitmq / PhpAmqpLib PRECONDITION_FAILED - unknown delivery tagRabbitmq / PhpAmqpLib PRECONDITION_FAILED - 未知的交付标签
【发布时间】:2015-05-12 21:28:06
【问题描述】:

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

我正在使用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 时。

到目前为止我做了什么:

  • 注册多个频道(一个用于发布,一个用于消费)
  • 发挥交付模式和耐用性

如果你用谷歌搜索这个错误,很多人会说你在 no_ack=true 时尝试确认消息,但在我的情况下这是错误的。

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

stacktrace如下:

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

不知何故,频道似乎已关闭,这是不应该发生的。

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

【问题讨论】:

    标签: php symfony rabbitmq amqp


    【解决方案1】:

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

    原因:

    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 块中。

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多