在 Laravel 中,如何控制 Job 是通过队列处理还是同步处理

pat*_*ato 2 queue laravel

我为我的大部分“业务交易”编写了 Jobs,结果证明它在干净、可读的架构方面运行良好。

在作业本身中,我必须决定作业在我的代码中分派后是否应该同步运行或通过队列运行。

大多数时候我可以清楚地决定什么最适合一份工作。尽管如此,在某些情况下,在继续进一步的流程之前,必须知道任务已完成。有时,将任务排队是可以的,因为没有依赖性。

在这种情况下,我希望能够在我的代码中控制此流程。

例如通过做

$this->dispatch(new MyJob());

使用默认方式和

$this->queue(new MyJob())$this->run(new MyJob())以任何一种方式强制。

这是否有可能,或者我对这个话题完全感到困惑?

Jon*_*hon 5

至少在 Laravel 5.2 中,我认为你可以通过使用 或 来做到这dispatch一点dispatchNow

DispatchesJobs特征提供了这两种方法,而这两种方法又取决于实现Illuminate\Bus\Dispatcher

您应该创建一个可排队的作业,因为它实现了接口ShouldQueue

class MyJob extends Job implements ShouldQueue
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在,当需要将作业分派到队列时,您可以运行:

$this->dispatch(new MyJob());
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望立即分派作业,而不是让它排队,您可以运行:

$this->dispatchNow(new MyJob());
Run Code Online (Sandbox Code Playgroud)

或者,如果您想沿着这条路线走下去,您始终可以创建作业的可排队和不可排队版本。通过扩展不可排队作业并实现接口,您可以轻松地做到这一点,而无需重复自己ShouldQueue

class MyJob extends Job
{
    public function handle()
    {
        // Write your implementation
    }
} 
Run Code Online (Sandbox Code Playgroud)

class MyQueueableJob extends MyJob implements ShouldQueue
{
    // No need to write an implementation since it extends MyJob
}
Run Code Online (Sandbox Code Playgroud)