Класс PendingDispatch
Класс PendingDispatch возвращается методом dispatch, вызванным на объекте задания, и позволяет выполнить цепочку настроек перед фактической отправкой задания в очередь. Этот класс используется для добавления дополнительных параметров, таких как задержка выполнения, указание очереди, соединения, а также управление поведением задания в рамках транзакций базы данных.
Синтаксис
<?php
$pendingDispatch = new PendingDispatch($job);
$pendingDispatch->delay($seconds)
->onQueue($queueName)
->onConnection($connectionName)
->afterCommit()
->allOnQueue($queueName)
->allOnConnection($connectionName);
?>
Пример
Создадим простое задание для отправки уведомлений и отправим его в очередь с задержкой в 30 секунд:
<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
class SendNotificationJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $userId;
public function __construct($userId)
{
$this->userId = $userId;
}
public function handle()
{
echo "Sending notification to user: " . $this->userId;
}
}
?>
<?php
namespace AppHttpControllers;
use AppJobsSendNotificationJob;
class NotificationController extends Controller
{
public function send($userId)
{
$job = new SendNotificationJob($userId);
$pendingDispatch = $job->dispatch();
$pendingDispatch->delay(30);
echo "Job dispatched with delay";
}
}
?>
Результат выполнения кода:
"Job dispatched with delay"
Пример
Используем цепочку методов для полной настройки задания перед отправкой:
<?php
namespace AppHttpControllers;
use AppJobsProcessOrderJob;
class OrderController extends Controller
{
public function process($orderId)
{
$job = new ProcessOrderJob($orderId);
$pendingDispatch = $job->dispatch()
->onQueue('high')
->onConnection('redis')
->delay(60)
->afterCommit();
return response()->json(['status' => 'processing']);
}
}
?>
Результат выполнения кода:
"{"status":"processing"}"
Пример
Используем метод allOnQueue и allOnConnection для применения настроек ко всем заданиям в цепочке:
<?php
namespace AppHttpControllers;
use AppJobsFirstJob;
use AppJobsSecondJob;
use AppJobsThirdJob;
use IlluminateSupportFacadesBus;
class BatchController extends Controller
{
public function runBatch()
{
$batch = Bus::batch([
new FirstJob(),
new SecondJob(),
new ThirdJob()
])->dispatch();
$pendingDispatch = $batch->jobs[0]->dispatch()
->allOnQueue('low')
->allOnConnection('database');
echo "Batch dispatched with all jobs on low queue";
}
}
?>
Результат выполнения кода:
"Batch dispatched with all jobs on low queue"
Смотрите также
-
метод
dispatch,
который отправляет задание в очередь -
класс
delay,
который устанавливает задержку выполнения задания -
класс
onQueue,
который указывает очередь для задания -
класс
onConnection,
который указывает соединение для задания