dilneiss / laravel-unique-queue

防止相同作业被队列的 Laravel 队列连接

1.1.4 2021-03-25 01:43 UTC

This package is auto-updated.

Last update: 2024-09-25 10:38:03 UTC


README

这个 redis 队列驱动程序的工作方式与标准的 Laravel redis 队列驱动程序完全一样,但它可以防止相同的作业被多次队列。

要求

需要 PHP >= 7.1 已安装。

需要 illuminate/redisilluminate/queue,版本为 "~5.7"

安装

通过 Composer 需要

composer require dilneiss/laravel-unique-queue

配置

config/queue.php 中创建一个新的连接

return [
    // ...
    'connections' => [
        'my_unique_name' => [
            'driver'      => 'unique',
            'connection'  => 'default',
            'queue'       => env('UNIQUE_QUEUE_NAME', 'give-me-a-name'),
            'retry_after' => 90,
        ],
        //...
    ]
];

实现

实现一个唯一队列作业

您的作业应使用 UniquelyQueueable 特性

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mlntn\Queue\Traits\UniquelyQueueable;

class MyUniqueJob implements ShouldQueue {

    use Dispatchable, InteractsWithQueue, Queueable, UniquelyQueueable, SerializesModels;

    /* ... */

}

如果连接不是默认的,则在调度作业时需要指定连接

dispatch(new UniqueJob)->onConnection('my_unique_name');

实现唯一队列事件

由于事件仅封装作业,因此事件类也应使用 UniquelyQueueable 特性

 <?php

    namespace App\Events;

    use Illuminate\Queue\SerializesModels;
    use Mlntn\Queue\Traits\UniquelyQueueable;

    class MyEvent {

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

        public function getUniqueIdentifier()
        {
            return $this->entityId;
        }
    }

调度事件

    event(new MyEvent(123));

要指定队列,监听器必须提供连接名称

 <?php

    namespace App\Listeners;

    class MyListener {

        public $connection = env('UNIQUE_QUEUE_NAME');

        // use delay if you need
        public $delay = 10;

        public function handle(MyEvent $event) {
            // what ever you need
        }

    }

使用 Lumen

Lumen 处理绑定略有不同。使用 LumenQueueServiceProvider 启用 Lumen 中的唯一队列。

app.php 中注册服务提供者

$app->register(Mlntn\Providers\LumenQueueServiceProvider::class);

使用 Horizon

设置工作配置

    'worker_name' => [
        'connection' => 'my_unique_name',
        'queue'      => ['default'],
        'balance'    => 'auto',
        'processes'  => 16,
        'tries'      => 3,
    ],

运行队列工作

唯一队列行为在内部起作用。使用 artisan(通过 cli、supervisor 或其他方法)运行队列工作。有关更详细的信息,请参阅 https://github.com/illuminate/queue。指定在 config/queue.php 中使用的连接名称。

php artisan queue:work my_unique_name