【发布时间】:2016-12-05 00:32:02
【问题描述】:
我正在做一个项目,用户给我一些输入,然后我处理这些输入。此处理需要很长时间,因此我正在使用队列,并且我想向用户发送邮件,说明他们处理的数据已在我的应用程序上准备就绪。我想要实现的是,将所有这些作业放入队列中,然后处理它们,当一个用户的所有处理结束时,给那个用户发邮件。
我正在使用 2 阶段队列。首先,我获取输入并分派一个作业,其中输入被解析并划分为子数据集,并从该作业中分派另一个作业,该作业处理来自第一个作业的解析输入数据。我这样做的原因是,第一份工作比第二份工作花费的时间少,我想用工作只做处理,没有任何中断或额外的解析工作,第一阶段是解析,第二部分是所有关于处理。处理部分可能会失败,如果失败,队列会再次处理,所以如果我不将输入分成子作业,作业接近尾声的失败可能会导致作业的所有处理再次完成.
如果我将所有这些作业放入同一个队列,并将该邮件作业分配给Queue::after 方法,如果我理解正确,用户可能必须等待所有队列完成。我希望能够在处理完所有输入后向用户发送邮件,而无需等待任何其他用户的输入被处理。 Laravel Queue 的文档显示了一个示例方法:
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});
我从中了解到的是,这在每个处理的作业之后都有效,我可以使用 $event 对象访问作业属性。这不适用于我的两阶段队列结构。我知道我可以使用数据库中的一些计数器来检查所有处理是否已完成,但我想知道是否有更好、更优雅的方法来实现这一点。
非常感谢。
【问题讨论】:
-
您最好的选择是让该作业组的缓存或数据库值在两个作业完成后具有特定值,并在 after() 事件中检查它。 Jobs 的整个概念是拥有系统其他部分不知道的自包含流程。
标签: php laravel email queue jobs