Livewire 队列作业调度 afterRespone() 不起作用

Posted

技术标签:

【中文标题】Livewire 队列作业调度 afterRespone() 不起作用【英文标题】:Livewire queue job dispatch afterRespone() not working 【发布时间】:2021-04-22 14:47:42 【问题描述】:

我正在尝试将作业分派给同步驱动程序并在页面呈现后运行它。然后使用 Laravel Echo 将状态更新发送到前端。

作业类已创建并正在运行。 Livewire 组件正在工作。 Echo 正在工作。

我正在尝试在表单提交后从 livewire 组件调用调度。

所以发生的事情是 afterResponse 部分不起作用。

    // This inside the livewire component
    ImportJob::dispatchAfterResponse( $data );
    // OR tried both
    dispatch( new ImportJob( $data ) )->afterResponse();

他们都工作并开始工作,他们不做的是 afterResponse 部分。

如果我将调用链接到一个不存在的方法,它会首先呈现页面,但当然会在作业完成时抛出一个错误,即 null 上没有 noneExistingMethod。

    ImportJob::dispatchAfterResponse( $data )->nonExistingMethod();

编辑以清除。

问题是 livewire 组件在渲染页面之前等待作业完成。 如果我打开同一个页面两次并提交一个,我可以看到状态更新一一出现,但在提交表单的页面上,状态更新会在作业完成后一次性呈现。

【问题讨论】:

【参考方案1】:

我认为您需要使作业以异步模式运行。 我有同样的问题,我使用队列解决了。 在你的 livewire 组件中这样的东西会起作用:

ImportJob::dispatch( $data )->onQueue('default')

更多信息在这里:https://laravel.com/docs/8.x/queues

【讨论】:

以上是关于Livewire 队列作业调度 afterRespone() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用工作队列的 Kubernetes 作业调度

优先队列底层实现是堆(heap)(操作系统进程调度)

OO面向对象多线程编程作业总结

进程调度算法

[YARN-1963] 支持同一个队列内作业按优先级调度

作业调度算法