"PhpAmqpLib\Exception\AMQPRuntimeException: Channel connection is closed" 流明队列错误

"PhpAmqpLib\Exception\AMQPRuntimeException: Channel connection is closed" Error with Lumen Queues

我正在使用 vladimir-yuldashev/laravel-queue-rabbitmq 库在 Lumen 项目中使用 RabbitMq 队列。

队列功能运行良好,但我在日志文件中看到大量以下错误。

lumen.ERROR: PhpAmqpLib\Exception\AMQPRuntimeException: Channel connection is closed. in /var/www/html/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Channel/AbstractChannel.php:227

从错误堆栈跟踪来看,队列名称似乎被取为 "NULL"。这是我来自 queue.php

的 rabbitmq 连接配置
'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. 为多个监听器启动一个 worker 可以吗?
  2. 为什么我的日志中充满了这些错误?我该如何解决这个问题?

还有一点注意:不确定是否重要,我的事件是链接的。即,我正在从事件 1 的侦听器中触发事件 2,依此类推。

好吧,我终于在这方面有所突破了。显然,错误是由于此命令 php artisan queue:work rabbitmq 而发生的,因为我没有传递 --queue 选项并且我没有在我的 .env 文件中声明默认队列。

根据 ,我对这些队列命令如何工作的理解不正确。

如上面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