如何在无UI的情况下获取并显示Hangfire中所有存储的作业?
无UI环境下获取并显示Hangfire所有存储作业的方法
你的初次尝试方向是对的,但当前代码仅获取了排队中的作业,如果要覆盖所有状态的作业(执行中、已完成、失败、计划中等),需要调用MonitoringApi的多个方法来遍历不同作业池。
完整实现示例
下面是可以获取全量作业的改进版代码:
[HttpGet("jobs")] [ProducesResponseType(StatusCodes.Status200OK)] public IActionResult GetAllJobs() { var monitoringApi = JobStorage.Current.GetMonitoringApi(); var allJobs = new List<object>(); // 获取排队中的作业 var enqueuedJobs = monitoringApi.EnqueuedJobs(); foreach (var job in enqueuedJobs) { allJobs.Add(new { JobId = job.Key, JobName = job.Value.Job.Type.FullName, CreatedAt = job.Value.CreatedAt, EnqueuedAt = job.Value.EnqueuedAt, State = job.Value.State, Queue = job.Value.Queue }); } // 获取执行中的作业 var processingJobs = monitoringApi.ProcessingJobs(); foreach (var job in processingJobs) { allJobs.Add(new { JobId = job.Key, JobName = job.Value.Job.Type.FullName, CreatedAt = job.Value.CreatedAt, StartedAt = job.Value.StartedAt, State = job.Value.State, ServerId = job.Value.ServerId }); } // 获取已完成的作业(示例取全量,可按分页或时间范围调整) var completedJobs = monitoringApi.SucceededJobs(0, int.MaxValue); foreach (var job in completedJobs) { allJobs.Add(new { JobId = job.Key, JobName = job.Value.Job.Type.FullName, CreatedAt = job.Value.CreatedAt, SucceededAt = job.Value.SucceededAt, State = "Succeeded", Duration = job.Value.Duration }); } // 获取失败的作业 var failedJobs = monitoringApi.FailedJobs(0, int.MaxValue); foreach (var job in failedJobs) { allJobs.Add(new { JobId = job.Key, JobName = job.Value.Job.Type.FullName, CreatedAt = job.Value.CreatedAt, FailedAt = job.Value.FailedAt, State = "Failed", ExceptionMessage = job.Value.Exception.Message }); } // 获取计划中的作业 var scheduledJobs = monitoringApi.ScheduledJobs(); foreach (var job in scheduledJobs) { allJobs.Add(new { JobId = job.Key, JobName = job.Value.Job.Type.FullName, CreatedAt = job.Value.CreatedAt, ScheduledAt = job.Value.ScheduledAt, State = "Scheduled" }); } return Ok(allJobs); }
关键说明
MonitoringApi是Hangfire提供的核心查询接口,不同方法对应不同状态的作业集合- 若需要分页,可调整
SucceededJobs、FailedJobs等方法的参数(例如monitoringApi.SucceededJobs(pageIndex * pageSize, pageSize)) - 可根据业务需求裁剪返回字段,仅保留
JobId、JobName、State等核心信息即可
内容的提问来源于stack exchange,提问作者MarcGr
相关产品推荐
相关产品推荐

