求解 Laravel 使用vladimir-yuldashev/laravel-queue-rabbitmq的问题

1. 运行环境

Laravel Framework 9.52.16
PHP 8.0.2 (cli) (built: Feb  3 2021 18:36:37) ( NTS Visual C++ 2019 x64 )
Copyright (c) The PHP Group
Zend Engine v4.0.2, Copyright (c) Zend Technologies

2. 问题描述?

执行消息入队操作失败,不指定交换机则可以成功创建消息队列,但是无法使用php artisan queue:work rabbitmq 命令进行消费

TestMqQueue::dispatch(['id' => 3])->onConnection('rabbitmq')->onQueue('test_ssss');

3. 步骤操作

composer安装rabbitmq

composer require vladimir-yuldashev/laravel-queue-rabbitmq ^13

config\queue.php的connections中增加配置

'rabbitmq' => [
            'driver' => 'rabbitmq',
            'hosts' => [
                [
                    'host' => env('RABBITMQ_HOST', '127.0.0.1'),
                    'port' => env('RABBITMQ_PORT', 5672),
                    'user' => env('RABBITMQ_USER', 'guest'),
                    'password' => env('RABBITMQ_PASSWORD', 'guest'),
                    'vhost' => env('RABBITMQ_VHOST', '/'),
                ],
            ],
            'options' => [
                'ssl_options' => [
                    'cafile' => env('RABBITMQ_SSL_CAFILE', null),
                    'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null),
                    'local_key' => env('RABBITMQ_SSL_LOCALKEY', null),
                    'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true),
                    'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null),
                ],
                'queue' => [
                    'job' => VladimirYuldashev\LaravelQueueRabbitMQ\Queue\Jobs\RabbitMQJob::class,
                    'exchange' => 'live',
                    'exchange_type' => 'topic'
                ],
            ],
            'worker' => env('RABBITMQ_WORKER', 'default'),
        ],

新建Job

class TestMqQueue implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public array $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    /**
     * 执行该队列进行消费
     * 使用 php artisan queue:work rabbitmq --queue==指定的队列名称 进行消费
     * @return void
     */
    public function handle()
    {
        Log::info('消费成功!');
    }
}

接口增加并执行该接口

TestMqQueue::dispatch(['id' => 3])->onConnection('rabbitmq')->onQueue('test_ssss');

成功创建交换机,并指定场景,但是test_ssss队列并没有创建成功!
rabbitmq截图

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

看起来是queue 没跟 exchage 绑定啊,还有是否必须 topic 类型,一般场景 direct 足够了,可以 rabbitmq 控制台手动操作绑定一下,测试一下吧。

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!