Laravel - Работа подряд в последовательности - PullRequest
0 голосов
/ 25 октября 2018

Я изучаю 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);
        });
    }
}

Это отлично работает, кроме того, что работаетработа на нескольких рабочих и не в гарантированном порядке.Есть ли способ запускать задания одно за другим?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

То, что вы ищете, как вы упоминаете в своем вопросе, это цепочка работы.

Из документов Laravel

Цепочка заданий позволяет указывать список заданий в очереди, которые должны выполняться последовательно.В случае сбоя одного задания в последовательности остальные задания не будут выполнены.Чтобы выполнить цепочку заданий, поставленных в очередь, вы можете использовать метод withChain на любом из ваших диспетчеризуемых заданий:

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->dispatch();

Так в приведенном выше примере

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

Job::withChain($mailJobs)->dispatch()

Должно дать ожидаемоерезультат!

Обновление

Если вы не хотите использовать начальное задание для цепочки (как показано в приведенном выше примере документации), вы сможете создатьпустой Job класс, который имеет use Dispatchable;.Тогда вы можете использовать мой пример выше

0 голосов
/ 26 октября 2018

Что вам нужно, так это Job Chaining.

Вы можете прочитать все об этом на веб-сайте Laravel: Цепочка

Удачи

0 голосов
/ 25 октября 2018

Все зависит от того, сколько рабочих очереди вы запустите.

Если вы запустите одного работника очереди , эти jobs будут обработаны в порядке ихбыли в очереди.Однако, если вы запустите несколько работников очереди , очевидно, они будут запущены в одно и то же время.Вот так должны работать очереди.Вы добавляете некоторые задачи, и они могут выполняться в одно и то же время в другом порядке.

Конечно, если вы хотите убедиться, что между этими jobs есть пауза , вы можете внутри each добавьте sleep () , но при условии, что вы запускаете это в контроллере (что может быть не очень хорошей идеей, потому что в случае, если у вас миллион подписок), это может быть не лучшим решением.

...