我为我的大部分“业务交易”编写了 Jobs,结果证明它在干净、可读的架构方面运行良好。
在作业本身中,我必须决定作业在我的代码中分派后是否应该同步运行或通过队列运行。
大多数时候我可以清楚地决定什么最适合一份工作。尽管如此,在某些情况下,在继续进一步的流程之前,必须知道任务已完成。有时,将任务排队是可以的,因为没有依赖关系。
在这种情况下,我希望能够在我的代码中控制此流程。
例如通过这样做
$this->dispatch(new MyJob());
使用默认方式并且
$this->queue(new MyJob())
或 $this->run(new MyJob())
强制任一方向。
这有可能吗,还是我对这个话题完全感到困惑?
在 Laravel 5.2 中,至少我认为你可以使用
dispatch
或 dispatchNow
来做到这一点。
DispatchesJobs
特质提供了这两种方法,而这两种方法又遵循Illuminate\Bus\Dispatcher
实现。
您应该创建一个可排队的作业,因为它实现了
ShouldQueue
接口:
class MyJob extends Job implements ShouldQueue
{
// ...
}
现在,当需要将作业分派到队列时,您可以运行:
$this->dispatch(new MyJob());
或者,如果您想立即分派作业,而不是让它排队,您可以运行:
$this->dispatchNow(new MyJob());
或者,如果您想沿着这条路线走下去,您可以随时创建作业的可排队和不可排队版本。通过扩展不可排队作业并实现
ShouldQueue
接口,您可以轻松地做到这一点,而无需重复自己。
class MyJob extends Job
{
public function handle()
{
// Write your implementation
}
}
和
class MyQueueableJob extends MyJob implements ShouldQueue
{
// No need to write an implementation since it extends MyJob
}
从 Laravel 8 开始,您应该使用 dispatchSync 来同步调度作业。例如:
App\Jobs\SendEmails::dispatchSync();
此外,Laravel 还提供了一个辅助函数 dispatch_sync,其工作方式相同。您可以按如下方式使用它:
dispatch_sync(new App\Jobs\SendEmails);