Событие выключения после завершения цепочки заданий - PullRequest
0 голосов
/ 01 октября 2019

У меня ниже Слушатель называется ProcessDocumentFields. Мой класс слушателя реализует ShouldQueue.

. В этом я запускаю два задания, используя метод withChain, как показано ниже:

ParseFieldContent::withChain([
        new ParseFieldRules($event->document, $fields),
])->dispatch($event->document, $fields);

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

Дело в том, что оба задания (ParseFieldContent и ParseFieldRules) должны были завершиться.

#If below is true, fire off
if ($event->document->stream->settings()->get('field_routing')) {
   event(new DocumentDefaultRulesWasProcessed($event->documents));
}

Вышеуказанное событие вызоветте же самые две работы, но я должен сначала сделать некоторые другие проверки:

#EventServiceProvider.php
DocumentDefaultRulesWasProcessed::class => [
     ProcessDocumentRouteFields::class,
],

Внутри моего ProcessDocumentRouteFields у меня есть:

foreach ($event->routes as $route) {
        if ($this->assertIfRouteFieldsShouldBeHandled($route, $event->document)) {
            ParseFieldContent::withChain([
                new ParseFieldRules($event->document, $route->fields, false),
            ])->dispatch($event->document, $route->fields);
        }
}

Как вы можете видеть выше, язапустите два одинаковых задания (ParseFieldContent и ParseFieldRules) - но только в том случае, если определенное утверждение верно.

У меня вопрос: как я могу убедиться, что задания, помещенные в ProcessDocumentFields, выполняются первыми,тогда когда запускается событие ``, задания в ProcessDocumentRouteFields будут выполняться?

1 Ответ

0 голосов
/ 03 октября 2019

На первый взгляд, вы можете установить какой-то индикатор, либо с помощью кэширования, либо с помощью БД, который используется для проверки того, обрабатываются / выполняются ли задания ProcessDocumentFields.

Затем в вашем ProcessDocumentRouteFieldsВы проверяете, находится ли задание все еще в обработке / запуске.

Метод кэширования будет выглядеть примерно так:

if (cache('processing_job')) {
    return;
}

foreach ($event->routes as $route) {
        if ($this->assertIfRouteFieldsShouldBeHandled($route, $event->document)) {
            ParseFieldContent::withChain([
                new ParseFieldRules($event->document, $route->fields, false),
            ])->dispatch($event->document, $route->fields);
        }
}

Обратите внимание, что при кэшировании должно быть установлено достаточно временидля выполнения заданий.

cache('processing_job', true, now()->addMinutes(20));

После этого можно удалить пару ключ / значение после завершения всего (поместить в конец сценария задания):

Cache::forget('processing_job');

После этогов следующий раз, когда будет выполнена проверка кеша, помощник кеша вернет false и обработает другие задания.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...