Vis*_*h K 2 redis laravel laravel-5 laravel-queue laravel-horizon
我正在学习 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);
});
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,除了它在多个工作人员之间运行作业并且没有保证的顺序。有没有办法一个接一个地运行作业?
正如您在问题中提到的,您正在寻找的是工作链。
作业链允许您指定应按顺序运行的排队作业列表。如果序列中的一项作业失败,则其余作业将不会运行。要执行排队的作业链,您可以在任何可调度的作业上使用 withChain 方法:
Run Code Online (Sandbox Code Playgroud)ProcessPodcast::withChain([ new OptimizePodcast, new ReleasePodcast ])->dispatch();
所以在你上面的例子中
$mailJobs = Subscriptions::all()
->map(function($subscription) {
return new SendMailJob($subscription);
});
Job::withChain($mailJobs)->dispatch()
Run Code Online (Sandbox Code Playgroud)
应该给出预期的结果!
更新
如果您不想使用初始作业进行链接(如上面的文档示例所示),您应该能够创建一个Job
包含use Dispatchable;
. 然后你可以使用我上面的例子