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 块中。
我知道这个问题被问过不止一次,但这一次是不同的。
我正在使用 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 块中。