Для определенного задания Laravel Horizon у меня есть функция, которая проверяет, выполняется ли задание для конкретной модели, на основе репозиториев Horizon:
public static function isRunning($model)
{
$tag = self::getTag($model);
$tagRepository = app()->make(TagRepository::class);
$jobRepository = app()->make(JobRepository::class);
$jobIds = $tagRepository->jobs($tag);
$jobs = $jobRepository->getJobs($jobIds);
$runningJobs = collect($jobs)->reject(function($job) {
return $job->status === HorizonRedisJobStatuses::STATUS_COMPLETED // 'completed'
|| $job->status === HorizonRedisJobStatuses::STATUS_FAILED; // 'failed'
});
return $runningJobs->count() > 0;
}
Этот код работает большую часть времени, однако бывают случаи, когда такая работа перезапускается из-за тайм-аута. В таком случае все рабочие места у меня есть в $jobs
переменные помечены как "completed"
, так что функция возвращает false
, Кажется, что перезапущенные задания не заполняются в репозитории.
В настоящее время единственный обходной путь, который я нашел, — это отслеживать статус задания вручную в базе данных при запуске / завершении процессов, однако это может дать мне неверные результаты, если, например, в Horizon закончились попытки.
Так есть ли у кого-нибудь идеи, как правильно отслеживать статус работы в Horizon?
Я выложил это как ошибку на Horizon Github, это было исправлено в запросе pull https://github.com/laravel/horizon/pull/478
Теперь код в примере должен работать правильно.
Других решений пока нет …