在Laravel中,如何控制是应该通过队列还是同步处理作业

时间:2016-08-18 16:59:11

标签: laravel queue

我为大多数“业务交易”写了乔布斯,结果表明,在干净,可读的架构方面工作得很好。

在Job本身,我要决定一旦在我的代码中调度,Job应该同步运行还是通过队列运行。

大多数时候,我可以清楚地决定什么最适合工作。尽管如此,在我可以继续进一步处理之前,我知道任务已经完成的情况很重要。有时,可以将任务排队,因为没有依赖项。

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

例如,通过

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

使用默认方式和

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

这在某种程度上是可能的,还是我对这个话题完全感到困惑?

1 个答案:

答案 0 :(得分:1)

在Laravel 5.2中,至少我认为您可以使用dispatchdispatchNow执行此操作。

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
}