Как получить jobId для Job в Laravel
*Создаю данный вопрос, ибо все которые я прочитал относятся либо к старым версиям ларавел, либо не отвечают как мне сделать это
Итак небольшие технические моменты перед самим кодом:
- Мой родительский контроллер использует трейт illuminate\Foundation\Bus\DispatchesJobs который позволяет вызывать $this->dispatch в контроллере
- Я вызываю $jobId = $this->dispatch(new MyJob()) (Судя по многим ресурсам при вызове жобы через трейт Bus он должен возвращать job id
- Логи по итогу показывают мне то, что мой $jobId = null :c
Теперь о реализации: (буду выкладывать не полные подробности каждого класса, а только то, что кажется необходимым, но при необходимости дополню всеми недостающими материалами)
В соответствии с правильной реализацией при необходимости получить jobId вне жобы использую трейт
use Illuminate\Foundation\{
Auth\Access\AuthorizesRequests,
Bus\DispatchesJobs,
Validation\ValidatesRequests
};
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
После контроллер с трейтом наследуется контроллером в котором происходит сам вызов жобы
class Reports extends Controller
{
public function build(Report $report, ReportQueue $reportQueue): Response
{
$jobId = null;
if ($report->type_is_users) {
$jobId = $this->dispatch(new BuildUsersReport($report, 1000000));
}
По итогу выполнения данного кода логи показывают, что type_is_users = true, а $jobId остаётся null.
Сама жоба. начнём с того, что она тоже наследуется от абстрактного класса который имплементирует ShouldQueue и использует необходимые для жобы трейты
abstract class ExcelReport implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
И непосредственно сама жоба, но в ней по сути ничего сверхестественного и она довольно большая, поэтому закину сюда верхушку класса
final class BuildMessageRecipientsReport extends ExcelReport
{
/** @var Message */
private Message $message;
public function __construct(Report $report, Message $message, int $sheetLineCount)
{
if (! $report->type_is_message_recipients) {
throw new RuntimeException("Неверный тип отчета.");
}
parent::__construct($report, $sheetLineCount);
$this->message = $message;
}
public function handle(
По итогу через horizon я отслеживаю, что жоба запускается, но при её запуске jobId остаётся пустым и я никак не могу сообразить что я делаю не так чтобы его получить. Запускается job через redis
Спустя несколько дней данный вопрос всё также актуален
Ответы (1 шт):
Всем доброго дня. Что-же, раз решения для меня не было дано, то спустя время я смог найти его сам.
Получим мы jobId или нет решается в файле конфигурации queue.php, а именно за счёт параметра after_commit в соединении вашей очереди.
false - получаем jobId
true - не получаем jobId
UPD: именно после этой правки следующая запись в моём вопросе начала работать:
if ($report->type_is_users) {
$jobId = $this->dispatch(new BuildUsersReport($report, 1000000));
}
Но подмечу ещё момент, что это будет работать при вызове $this->dispatch из трейта DispatchesJobs, который должен использовать ваш контроллер
use Illuminate\Foundation\{
Auth\Access\AuthorizesRequests,
Bus\DispatchesJobs,
Validation\ValidatesRequests
};
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}