freyo/laravel-queue-cmq

腾讯云CMQ SDK队列适配器

6.0.0 2021-06-04 06:32 UTC

README

Laravel Queue腾讯云消息队列驱动

Software License Build Status Coverage Status Quality Score Packagist Version Total Downloads

FOSSA Status

安装

composer require freyo/laravel-queue-cmq

配置

Laravel 5.5+ 使用包自动发现,因此不需要手动添加 ServiceProvider。

  1. config/app.php:
'providers' => [
  // ...
  Freyo\LaravelQueueCMQ\LaravelQueueCMQServiceProvider::class,
]
  1. .env:
QUEUE_DRIVER=cmq

CMQ_SECRET_KEY=
CMQ_SECRET_ID=

CMQ_QUEUE_HOST=https://cmq-queue-{region}.api.qcloud.com
CMQ_QUEUE=queue_name #default queue name
CMQ_QUEUE_POLLING_WAIT_SECONDS=0

CMQ_TOPIC_ENABLE=false # set to true to use topic
CMQ_TOPIC_FILTER=routing # or msgtag
CMQ_TOPIC_HOST=https://cmq-topic-{region}.api.qcloud.com
CMQ_TOPIC=topic_name

提示

  • 地区应该替换为特定地区:gz(广州)、sh(上海)或bj(北京)。

  • 公共网络API请求的域名:cmq-queue-region.api.qcloud.com / cmq-topic-region.api.qcloud.com

  • 私有网络API请求的域名:cmq-queue-region.api.tencentyun.com / cmq-topic-region.api.tencentyun.com

使用方法

完成配置后,您可以使用 Laravel 队列 API。如果您使用了其他队列驱动程序,则无需更改其他内容。如果您不知道如何使用队列 API,请参阅官方 Laravel 文档:https://laravel.net.cn/docs/queues

示例

调度任务

默认连接名称为 cmq

//use queue only
Job::dispatch()->onConnection('connection-name')->onQueue('queue-name');
// or dispatch((new Job())->onConnection('connection-name')->onQueue('queue-name'))

//use topic and tag filter
Job::dispatch()->onConnection('connection-name')->onQueue('tag1,tag2,tag3');
// or dispatch((new Job())->onConnection('connection-name')->onQueue('tag1,tag2,tag3'))

//use topic and routing filter
Job::dispatch()->onConnection('connection-name')->onQueue('routing-key');
// or dispatch((new Job())->onConnection('connection-name')->onQueue('routing-key'))

多个队列

配置 config/queue.php

'connections' => [
    //...
    'new-connection-name' => [
        'driver' => 'cmq',
        'secret_key' => 'your-secret-key',
        'secret_id'  => 'your-secret-id',
        'queue' => 'your-queue-name',
        'options' => [
            'queue' => [
                'host'                 => 'https://cmq-queue-region.api.qcloud.com',
                'name'                 => 'your-queue-name',
                'polling_wait_seconds' => 0, // 0-30 seconds
                'retries'              => 3,
            ],
            'topic' => [
                'enable'  => false,
                'filter'  => 'routing', // routing or msgtag
                'host'    => 'https://cmq-topic-region.api.qcloud.com',
                'name'    => 'your-topic-name',
                'retries' => 3,
            ],
        ],
        'plain' => [
            'enable' => false,
            'job' => 'App\Jobs\CMQPlainJob@handle',
        ],
    ];
    //...
];

处理任务

php artisan queue:work {connection-name} --queue={queue-name}

纯模式

配置 .env

CMQ_PLAIN_ENABLE=true
CMQ_PLAIN_JOB=App\Jobs\CMQPlainJobHandler@handle

创建一个实现 PlainPayload 接口的作业。方法 getPayload 必须返回一个字符串值。

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Freyo\LaravelQueueCMQ\Queue\Contracts\PlainPayload;

class CMQPlainJob implements ShouldQueue, PlainPayload
{
    use Dispatchable, InteractsWithQueue, Queueable;
    
    protected $payload;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($payload)
    {
        $this->payload = $payload;
    }
    
    /**
     * Get the plain payload of the job.
     *
     * @return string
     */
    public function getPayload()
    {
        return $this->payload;
    }
}

创建一个纯作业处理器

<?php

namespace App\Jobs;

use Illuminate\Queue\Jobs\Job;

class CMQPlainJobHandler
{
    /**
     * Execute the job.
     * 
     * @param \Illuminate\Queue\Jobs\Job $job
     * @param string $payload
     * 
     * @return void
     */
    public function handle(Job $job, $payload)
    {
        // processing your payload...
        var_dump($payload);
        
        // release back to the queue manually when failed.
        // $job->release();
        
        // delete message when processed.
        if (! $job->isDeletedOrReleased()) {
            $job->delete();
        }        
    }
}

参考资料

许可协议

MIT 许可协议 (MIT)。有关更多信息,请参阅许可文件

FOSSA Status