我正在开发一个用户给我一些输入的项目,然后我处理这些输入。这个处理需要很长时间,所以我正在使用队列,并且我想向用户发送邮件,表明他们处理过的数据已在我的应用程序上准备就绪。我想要实现的是,将所有这些作业放入队列,然后处理它们,当用户的所有处理结束时,发送给该用户。
我正在使用2阶段队列。首先,我获取输入并分派一个输入被解析并分成子数据集的作业,并从该作业调度另一个作业,该作业处理来自第一个作业的已解析输入数据。为什么我这样做,第一个作业比第二个作业花费的时间少,我想使用作业只进行处理,没有任何中断或额外的解析工作,第一个阶段是关于解析,第二个部分是所有关于处理。如果处理失败,处理部分可能会失败并且队列将再次处理它,因此如果我不将输入分成子作业,则作业结束附近的失败可能导致作业的所有处理再次完成
如果我将所有这些作业放到同一个队列中,并将该邮件作业分配给Queue::after
方法,则用户可能必须等待所有队列完成,如果我理解正确的话。我希望能够在处理完所有输入后向用户发送邮件,而无需等待处理任何其他用户的输入。 Laravel Queue的文档显示了一个示例方法:
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});
我从中理解的是,这在每个已处理的作业之后都有效,我可以使用$event
对象访问作业属性。这不适用于我的两阶段队列结构。我知道我可以在数据库中使用一些计数器来检查是否所有处理都已完成,但我想知道是否有更好,更优雅的方法来实现这一点。
非常感谢。
答案 0 :(得分:1)
已经有几年了,但是Laravel 8可以提供解决方案:
https://github.com/laravel/framework/pull/32830
作业可以批量运行,并在所有作业完成,任何作业失败或所有作业成功完成时调用回调。