Laravel Horizon:作业状态跟踪
Laravel Horizon: job status tracking
对于某个 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"
,因此函数 returns false
。似乎重新启动的作业没有填充到存储库。
目前我想出的唯一解决方法是在数据库中手动跟踪 start/finish 进程的作业状态,但是,如果 Horizon 尝试次数用尽,这仍然会给我错误的结果。
那么有人知道如何正确跟踪 Horizon 中的作业状态吗?
我将其作为错误发布在 Horizon Github 上,已在拉取请求中修复 https://github.com/laravel/horizon/pull/478
现在示例中的代码应该可以正常工作了。
对于某个 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"
,因此函数 returns false
。似乎重新启动的作业没有填充到存储库。
目前我想出的唯一解决方法是在数据库中手动跟踪 start/finish 进程的作业状态,但是,如果 Horizon 尝试次数用尽,这仍然会给我错误的结果。
那么有人知道如何正确跟踪 Horizon 中的作业状态吗?
我将其作为错误发布在 Horizon Github 上,已在拉取请求中修复 https://github.com/laravel/horizon/pull/478
现在示例中的代码应该可以正常工作了。