Подскажите / Помогите добавить зависимости между Job-aми в Laravel. Необходимо реализовать "надстройку" над джобами - которая учитывает их зависимости. Запустить job B, только когда будут обработаны все задачи Job A.
Глобально задача следующая:
Я загружаю большой XML файл с объявлениями. Обработку каждого объявления хочу запускать отдельным Job-ом, чтобы запараллелить выполнение однотипных задач.
Но после обработки всех объявлений (всех job-ов) необходимо сформировать отчет загрузки. Как мне отследить, что все задачи, которые были запущены именно в рамках обработки этого XML (параллельно может загружаться и другой XML), выполнены (успешно или неуспешно)? Как бы вы реализовали этот функционал?
JhaoDa спасибо за ссылку, прочитал еще раз. И знал и использовал этот функционал раньше. Давайте только придумаем вместе как это решит конкретно эту задачу. У меня пока нет идей.
boobooking, т.е. отпал вопрос с тем, кто будет генерировать эти события? Тогда что не понятно? Поймали событие, куда-то записали, что очередная задача для пакета объявлений закончена, проверили, если ли ещё задачи относящиеся к этому пакету объявлений, если нет, то запускаем формирование отчёта.
JhaoDa Получается, что каждый JobA должен следить за всеми своими соседями по группе:
1) при событии before должен записать (допустим в Redis), что он часть обработки конкретного XML
2) при событии after удалить эту запись и проверить есть ли еще другие и если никого нет, то запустить обработку отчета
Плюс возможна такая ситуация, что парсинг XML и запихивание в очередь этих задач JobA будет медленнее чем, выполнение самой этой микрозадачи JobA. И тогда запустится создание отчета, хотя на самом деле еще не все задачи были положены в очередь.
Получается этот "глупый" микротаск JobA начинает отвечать за то, что даже не видит полностью. Тут явно нужен сторонний наблюдатель, который видит всю группу задач.
boobooking, наблюдатель - еще одна задача, которая запускается после окончания запуска подзадач и внутри проверяет завершение работы группы подзадач и если еще что-то работает, то откладывается на какое-то время (такой функционал есть $this->release($delay)). Однако в любом случае необходимо группировать задачи.
Чтобы решить проблему быстрых подзадач (когда подзадача быстрее, чем создание других подзадач), можно выставлять флаги блокировки, по наличию которого наблюдатель будет знать, что хоть задач и нет, но они еще могут появиться.