*我正在创建这个问题,因为我读过的所有问题要么引用了旧版本的 Laravel,要么没有回答我如何做到这一点。
所以,在代码本身之前有一些技术要点:
- 我的父控制器使用照亮\Foundation\Bus\DispatchesJobs特征,它允许在控制器中调用$this->dispatch
- 我调用 $jobId = $this->dispatch(new MyJob()) (从许多资源来看,当通过 Bus 特征调用作业时,它应该返回作业 id
- 生成的日志显示我的 $jobId = null :c
现在关于实现:(我不会发布每个类的完整详细信息,而只会发布看起来必要的内容,但如果有必要,我将补充所有缺少的材料)
按照正确的实现,如果需要获取job之外的jobId,我使用trait
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 仍然为空,我只是不知道我做错了什么来获取它。作业通过redis启动
几天后,这个问题仍然具有现实意义。
大家下午好。好吧,由于没有给我解决方案,过了一段时间我就自己找到了。
是否获取jobId由queue.php配置文件决定,即通过队列连接中的after_commit参数决定。
false - 获取 jobId
true - 不获取 jobId
UPD:正是在这次编辑之后,我的问题中的以下条目开始起作用:
但我还要注意,当从 DispatchesJobs 特征调用 $this->dispatch 时,这将起作用,您的控制器应该使用它