"Исключение phpamqplibexceptionamqpruntimeexception: Соединение с каналом закрыто" Ошибка с очередями просвета


Я использую библиотеку владимир-юлдашев/laravel-queue-rabbitmq для использования очередей RabbitMQ в проекте Lumen.

Функция очереди работает нормально, но я вижу множество ошибок ниже в своем файле журнала.

Люмен.ОШИБКА: phpamqplib\Исключение\Исключение amqpruntimeexception: Соединение с каналом закрыто. в /var/www/html/поставщик/php-amqplib/php-amqplib/phpamqplib/Канал/абстрактный канал.php:227

Из трассировки стека ошибок кажется, что имя очереди принимается как "НУЛЕВОЙ". Вот моя конфигурация подключения rabbitmq из queue.php

'rabbitmq'  => [
        'driver' => 'rabbitmq',

        'host' => env('RABBITMQ_HOST', 'rabbitmq'),
        'port' => env('RABBITMQ_PORT', 5672),

        'vhost'    => env('RABBITMQ_VHOST', '/'),
        'login'    => env('RABBITMQ_LOGIN', 'guest'),
        'password' => env('RABBITMQ_PASSWORD', 'guest'),

        'queue' => env('RABBITMQ_QUEUE'),
        // name of the default queue,

        'exchange_declare' => env('RABBITMQ_EXCHANGE_DECLARE', true),
        // create the exchange if not exists
        'queue_declare_bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true),
        // create the queue if not exists and bind to the exchange

        'queue_params' => [
            'passive'     => env('RABBITMQ_QUEUE_PASSIVE', false),
            'durable'     => env('RABBITMQ_QUEUE_DURABLE', true),
            'exclusive'   => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
            'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false),
        ],
        'exchange_params' => [
            'name' => env('RABBITMQ_EXCHANGE_NAME', null),
            'type' => env('RABBITMQ_EXCHANGE_TYPE', 'direct'),
            // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html
            'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),
            'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true),
            // the exchange will survive server restarts
            'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
        ],

        'sleep_on_error' => env('RABBITMQ_ERROR_SLEEP', 5), // the number of seconds to sleep if there's an error communicating with rabbitmq

    ]

Я не использую очередь по умолчанию. Вместо этого каждый из моих прослушивателей событий объявляет очередь для себя. Вот как я использую команды очереди для запуска рабочего и слушателей.

Рабочий

php artisan queue:work rabbitmq

Слушатели

php artisan queue:listen --queue=my-queue-1 --timeout=0
php artisan queue:listen --queue=my-queue-2 --timeout=0
php artisan queue:listen --queue=my-queue-3 --timeout=0

Каждая из этих функций очереди работает нормально.

Мои вопросы таковы:

  1. Можно ли начать только один работник для нескольких слушателей?
  2. Почему мои журналы заполнены этими ошибками? И как я могу это исправить?

Еще одно примечание: Не уверен, имеет ли это значение, мои события связаны. т. Е. Я запускаю событие 2 из слушателей события 1 и так далее и тому подобное.

Author: ayip, 2017-07-05

1 answers

Хорошо, наконец-то у меня есть прорыв в этом вопросе. По-видимому, ошибка происходит из-за этой команды php artisan queue:work rabbitmq, так как я не передавал опцию --queue, и у меня нет очереди по умолчанию, объявленной в моем файле .env.

Согласно этому вопросу в SO, мое понимание того, как работают эти команды очереди, неверно.

Как упоминалось в приведенном выше URL-адресе, я полностью удалил queue:listen и использовал несколько команд queue:work, передавая имя очереди каждой рабочей команде. Итак, после изменений вот как выглядят мои команды:

php artisan queue:work --queue=my-queue-1 --timeout=0
php artisan queue:work --queue=my-queue-2 --timeout=0
php artisan queue:work --queue=my-queue-3 --timeout=0
 0
Author: ayip, 2017-07-13 19:45:25