dilneiss / laravel-unique-queue
防止相同作业被队列的 Laravel 队列连接
1.1.4
2021-03-25 01:43 UTC
Requires
- php: >=7.1
- illuminate/queue: ~5.7||~6||~7||~8
- illuminate/redis: ~5.7||~6||~7||~8
README
这个 redis 队列驱动程序的工作方式与标准的 Laravel redis 队列驱动程序完全一样,但它可以防止相同的作业被多次队列。
要求
需要 PHP >= 7.1 已安装。
需要 illuminate/redis
和 illuminate/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