Запуск функции один раз, когда все Laravel заданий в очереди завершены - PullRequest
0 голосов
/ 02 февраля 2020

Мое Laravel веб-приложение анализирует тысячи акций каждый день.

После того, как он проанализировал все акции в отдельности, мне нужно запустить функцию один раз , которая генерирует некоторую статистику о фондовом рынке в целом и отправляет электронное письмо с результатами моим пользователям. .

Из-за большого количества данных, которые должны быть обработаны на акцию, мне пришлось использовать Laravel работу на акцию, в противном случае сценарий остановился бы, и мне нужно запустить их asyn c с несколькими работниками, иначе анализ не будет завершен до начала следующего торгового дня.

Мой вопрос: как я могу запустить функцию один раз, когда все задания в очереди завершены?

Я думал о планировании задачи, которая запускается ежедневно при Queue::size() === 0, используя что-то вроде:

$schedule->call('App\Http\Controllers\DataController@runFinalFunctions')->daily()->when(function () { 
      // Check if job queue has finished running
      if (Queue::size() === 0) {
          // Queue empty or finished
          return true;
      }
});

Но как узнать разницу между пустой очередью, потому что задания еще не начались, и очередь пуста, потому что все задания на этот день закончились?

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

Есть идеи, как этого добиться элегантно? Я был бы навсегда в вашем долгу: -)

...