我正在学习 Laravel,正在开发一个运行 Horizon 来了解工作的项目。我被困在一个地方,我需要一次又一次地运行相同的工作几次。
这是我目前正在做的事情
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Subscriptions;
class MailController extends Controller
{
public function sendEmail() {
Subscriptions::all()
->each(function($subscription) {
SendMailJob::dispatch($subscription);
});
}
}
这工作得很好,除了它在多个工作人员之间运行作业并且不按保证的顺序运行。有没有办法让作业一个接一个地运行?
正如您在问题中提到的,您正在寻找的是工作链。
来自 Laravel 文档 https://laravel.com/docs/5.7/queues#job-chaining
作业链允许您指定应按顺序运行的排队作业列表。如果序列中的一项作业失败,则其余作业将不会运行。要执行排队作业链,您可以在任何可分派作业上使用 withChain 方法:
ProcessPodcast::withChain([
new OptimizePodcast,
new ReleasePodcast
])->dispatch();
所以在你上面的例子中
$mailJobs = Subscriptions::all()
->map(function($subscription) {
return new SendMailJob($subscription);
});
Job::withChain($mailJobs)->dispatch()
应该给出预期的结果!
Update
如果您不想使用初始作业来链接(如上面的文档示例所示),您应该能够创建一个空的Job
具有的类use Dispatchable;
。那么你可以使用我上面的例子
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)