Класс ShouldBeUnique
Класс ShouldBeUnique представляет собой интерфейс,
который используется в Laravel для предотвращения постановки
в очередь множества одинаковых заданий.
Когда задание реализует этот интерфейс,
система гарантирует, что в очереди присутствует
не более одного экземпляра задания с уникальным
идентификатором. Это особенно полезно для задач,
которые не должны выполняться параллельно,
например, обновление кэша или обработка платёжных транзакций.
Синтаксис
Для использования уникальности задания необходимо,
чтобы класс задания реализовал интерфейс
ShouldBeUnique и определил метод
uniqueId, возвращающий строку или число
для идентификации задания.
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
use IlluminateContractsQueueShouldBeUnique;
class ExampleJob implements ShouldQueue, ShouldBeUnique
{
public $userId;
public function __construct($userId)
{
$this->userId = $userId;
}
public function uniqueId()
{
return $this->userId;
}
public function handle()
{
// логика задания
}
}
?>
Пример
Давайте создадим задание для обработки обновления профиля пользователя. Уникальность будет определяться идентификатором пользователя, чтобы избежать множественных обновлений одного профиля одновременно:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
use IlluminateContractsQueueShouldBeUnique;
use AppModelsUser;
class UpdateUserProfile implements ShouldQueue, ShouldBeUnique
{
public $userId;
public $data;
public function __construct($userId, $data)
{
$this->userId = $userId;
$this->data = $data;
}
public function uniqueId()
{
return $this->userId;
}
public function handle()
{
$user = User::find($this->userId);
$user->update($this->data);
}
}
?>
Теперь отправим это задание в очередь для пользователя с идентификатором 1:
<?php
namespace AppHttpControllers;
use AppJobsUpdateUserProfile;
class UserController extends Controller
{
public function update($id)
{
$data = ['name' => 'New Name'];
UpdateUserProfile::dispatch($id, $data);
echo "Job dispatched successfully";
}
}
?>
Результат выполнения кода:
"Job dispatched successfully"
Пример
Интервал блокировки заданий можно настроить с помощью
свойства uniqueFor. Это определяет время,
в течение которого задание считается уникальным:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
use IlluminateContractsQueueShouldBeUnique;
class SendNotification implements ShouldQueue, ShouldBeUnique
{
public $userId;
public $uniqueFor = 3600;
public function __construct($userId)
{
$this->userId = $userId;
}
public function uniqueId()
{
return 'notification_' . $this->userId;
}
public function handle()
{
// отправка уведомления
}
}
?>
Отправим уведомление для пользователя с идентификатором 5:
<?php
namespace AppHttpControllers;
use AppJobsSendNotification;
class NotificationController extends Controller
{
public function send($userId)
{
SendNotification::dispatch($userId);
echo "Notification queued";
}
}
?>
Результат выполнения кода:
"Notification queued"
Пример
При необходимости можно явно указать, какие атрибуты
использовать для уникальности, переопределив
метод uniqueId для комбинированного ключа:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
use IlluminateContractsQueueShouldBeUnique;
class ProcessOrder implements ShouldQueue, ShouldBeUnique
{
public $orderId;
public $productId;
public function __construct($orderId, $productId)
{
$this->orderId = $orderId;
$this->productId = $productId;
}
public function uniqueId()
{
return $this->orderId . '_' . $this->productId;
}
public function handle()
{
// обработка заказа
}
}
?>
Отправим задание для обработки заказа с товаром:
<?php
namespace AppHttpControllers;
use AppJobsProcessOrder;
class OrderController extends Controller
{
public function process($orderId, $productId)
{
ProcessOrder::dispatch($orderId, $productId);
echo "Order processing job queued";
}
}
?>
Результат выполнения кода:
"Order processing job queued"
Смотрите также
-
интерфейс
ShouldQueue,
который указывает, что задание должно быть помещено в очередь -
класс
Job,
который представляет базовое задание в очереди -
метод
handle,
который содержит логику выполнения задания -
метод
dispatch,
который отправляет задание в очередь