Rabbitmq / PhpAmqpLib PRECONDITION_FAILED — неизвестный тег доставки

Я знаю, что этот вопрос задают не раз, но этот раз отличается.

Я использую 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

Каким-то образом канал кажется закрытым, где этого не должно быть.

Эта ошибка уже происходит, когда я запускаю ее в одном потоке.

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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]