laravel-多个作业结束后执行作业

问题描述 投票:2回答:1

我正在一个项目中,用户给了我一些输入,然后我处理这些输入。该处理需要很长时间,因此我正在使用队列,并且我想向用户发送邮件,表明他们的处理后的数据已在我的应用程序中就绪。我要实现的是,将所有这些作业放入队列,然后处理它们,并在用户的所有处理结束时,向该用户发送邮件。

我正在使用2相队列。首先,我得到输入并调度一个作业,在该作业中将输入进行解析并划分为子数据集,然后调度该作业中的另一个作业,该作业处理从第一个作业中解析出的输入数据。我这样做的原因是,第一项工作比第二项工作花费的时间少,并且我想使用工作仅进行处理,而不会进行任何中断或额外的解析工作,第一阶段就是解析,而第二部分是解析所有关于处理。处理部分可能会失败,并且如果失败,队列将再次对其进行处理,因此,如果我不将输入划分为多个子作业,则在作业即将结束时发生故障可能会导致对该作业的所有处理再次进行。

如果我正确理解的话,如果我将所有那些作业都放在同一个队列中,并将该邮件作业分配给Queue::after方法,则用户可能必须等待所有队列完成。我希望能够在用户的所有输入均已处理后向用户发送邮件,而不必等待任何其他用户的输入被处理。 Laravel Queue的文档显示了一个示例方法:

Queue::after(function (JobProcessed $event) {
    // $event->connectionName
    // $event->job
    // $event->job->payload()
});

而且据我了解,这在每个已处理的作业之后都有效,并且我可以使用$event对象访问作业属性。这不适用于我的两阶段队列结构。我知道我可以在数据库中使用一些计数器来检查所有处理是否都已完成,但是我想知道是否有更好,更优雅的方法来实现此目的。

非常感谢。

php laravel email queue jobs
1个回答
0
投票

已经过去了几年,但是Laravel 8可能为此提供了解决方案:

https://github.com/laravel/framework/pull/32830

作业可以批量运行,并在所有作业完成,任何作业失败或所有作业成功完成时调用回调。

© www.soinside.com 2019 - 2024. All rights reserved.