我正在使用vladimir-yuldashev/laravel-queue-rabbitmq库在Lumen项目中使用RabbitMq队列。
队列功能运行正常,但我在日志文件中看到了大量以下错误。
lumen.ERROR:PhpAmqpLib \ Exception \ AMQPRuntimeException:关闭通道连接。在/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
]
我没有使用默认队列。相反,我的每个事件侦听器都为自己声明一个队列。以下是我使用队列命令启动worker和listeners的方法。
工人
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,依此类推。
答案 0 :(得分:0)
好的,我终于在这个方面取得了突破。显然,由于我没有传递php artisan queue:work rabbitmq
选项并且我的--queue
文件中没有声明默认队列,因此该命令.env
发生错误。
根据this question on 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