如何在Hangfire 1.7.28中查询特定时间运行的作业?
查询Hangfire 1.7.28特定时间点运行的作业
方法一:直接查询底层数据库
Hangfire 1.7.x会将作业的状态变更记录存储在Hangfire.State表中,作业进入/退出Running状态的时间都能在这里找到。结合Hangfire.Job表的作业详情,就能筛选出目标时间点正在运行的作业。
执行以下SQL查询(替换[目标时间]为你的Bug发生精确时间):
SELECT j.Id AS 作业ID, j.Method AS 作业方法名, s.CreatedAt AS 进入运行状态时间, s.ExpireAt AS 退出运行状态时间 FROM Hangfire.Job j INNER JOIN Hangfire.State s ON j.Id = s.JobId WHERE s.StateName = 'Running' AND s.CreatedAt <= '[目标时间]' AND (s.ExpireAt IS NULL OR s.ExpireAt >= '[目标时间]')
- 逻辑说明:
CreatedAt是作业开始运行的时间,ExpireAt是作业结束运行的时间(若作业仍在运行则为NULL),通过这两个时间区间匹配目标时间点,就能定位当时正在运行的作业。
方法二:优化仪表盘筛选
如果不想操作数据库,可对Hangfire仪表盘的数据做二次处理:
- 进入仪表盘的「Jobs」页面,切换到「Recent」视图,这里会显示最近24小时的作业记录,包含
Started At(开始时间)和Duration(运行时长)。 - 将页面表格数据复制到Excel,通过公式计算作业的结束时间(
开始时间+时长),再筛选出覆盖目标时间点的作业记录。 - 也可使用浏览器的开发者工具(F12),在控制台执行简单脚本提取符合时间区间的记录,比如:
// 示例:筛选2024-05-20 14:30:00前后运行的作业 const targetTime = new Date('2024-05-20T14:30:00').getTime(); document.querySelectorAll('.job-list tr').forEach(tr => { const startTimeStr = tr.querySelector('.started-at')?.textContent; const durationStr = tr.querySelector('.duration')?.textContent; if (!startTimeStr || !durationStr) return; const startTime = new Date(startTimeStr).getTime(); // 简单转换时长为毫秒(示例仅处理秒级,需根据实际格式调整) const durationMs = parseInt(durationStr) * 1000; const endTime = startTime + durationMs; if (startTime <= targetTime && endTime >= targetTime) { console.log(tr.textContent); } });
内容的提问来源于stack exchange,提问作者user7545296
相关产品推荐
相关产品推荐

