mlntn/laravel-unique-queue

Laravel 队列连接,防止相同工作被多次排队

1.3.0 2020-10-13 17:56 UTC

This package is auto-updated.

Last update: 2024-09-11 05:13:58 UTC


README

⚠️ 已弃用

laravel/framework 中已实现唯一工作。请使用 Laravel 8.14.0 或更高版本中的官方实现。此存储库将不再更新,并将被存档。

Laravel Unique Queue

这个 Redis 队列驱动程序与标准的 Laravel Redis 队列驱动程序一样工作,但它防止相同的工作被多次排队。

要求

需要安装 PHP >= 7.1。

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

安装

通过 Composer 需要

composer require mlntn/laravel-unique-queue

配置

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

return [
    // ...
    'connections' => [
        'my_unique_queue_connection_name' => [
            'driver'      => 'unique',
            'connection'  => 'default',
            'queue'       => env('UNIQUE_QUEUE_NAME', 'my_unique_queue_name'),
            'retry_after' => 90,
        ],
        //...
    ]
];

实现

实现唯一队列工作

您的作业应使用 UniquelyQueueable 特性并具有 getUniqueIdentifier 方法

<?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;

    /* ... */

    public function getUniqueIdentifier()
    {
        return 'some-unique-identifier';
    }

}

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

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

实现唯一队列监听器

与作业类似,监听器类应使用 UniquelyQueueable 特性,并确保您已设置连接和队列

<?php

namespace App\Listeners;

use Illuminate\Contracts\Queue\ShouldQueue;
use Mlntn\Queue\Traits\UniquelyQueueable;

class MyListener implements ShouldQueue {

    public $connection = 'my_unique_queue_connection_name';

    public $queue = 'my_unique_queue_name';

    public function handle($event)
    {
        //
    }

    public function getUniqueIdentifier()
    {
        return 'some-unique-identifier';
    }
}

使用 Lumen

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

app.php 中注册服务提供者

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

使用 Horizon

设置工作配置

    'worker_name' => [
        'connection' => 'my_unique_queue_connection_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_queue_connection_name