Laravel - 按顺序运行作业

Vis*_*h K 2 redis laravel laravel-5 laravel-queue laravel-horizon

我正在学习 Laravel,正在从事一个运行 Horizo​​n 以了解工作的项目。我被困在一个地方,我需要一次又一次地运行相同的工作。

这是我目前正在做的

<?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)

这工作正常,除了它在多个工作人员之间运行作业并且没有保证的顺序。有没有办法一个接一个地运行作业?

Jos*_*osh 5

正如您在问题中提到的,您正在寻找的是工作链。

来自 Laravel 文档

作业链允许您指定应按顺序运行的排队作业列表。如果序列中的一项作业失败,则其余作业将不会运行。要执行排队的作业链,您可以在任何可调度的作业上使用 withChain 方法:

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->dispatch();
Run Code Online (Sandbox Code Playgroud)

所以在你上面的例子中

$mailJobs = Subscriptions::all()
    ->map(function($subscription) {
        return new SendMailJob($subscription);
    });

Job::withChain($mailJobs)->dispatch()
Run Code Online (Sandbox Code Playgroud)

应该给出预期的结果!

更新

如果您不想使用初始作业进行链接(如上面的文档示例所示),您应该能够创建一个Job包含use Dispatchable;. 然后你可以使用我上面的例子