HangFire 1.6.20 State表Data列日期格式异常问题排查及修复
HangFire 1.6.20失败任务仪表盘异常问题排查与修复
问题现象
在使用HangFire 1.6.20的项目中,启用HangFire仪表盘排查代码问题时,切换到失败任务第二页会抛出异常。
根因定位
经调试确认,数据库[HangFire].[State]表的Data列中FailedAt字段存在两种日期格式,是引发异常的直接原因:
执行SQL查询:
select top 1000 s.data from [HangFire].[Job] j join [HangFire].[State] s on j.StateId = s.Id where j.StateName = 'Failed'
返回结果显示两种格式:
{"FailedAt":"2022-11-30T15:34:13.7419289Z","ExceptionType":"..."} {"FailedAt":"1669822299229","ExceptionType":"..."}
- 第一条为正常的ISO 8601格式
- 第二条为毫秒级时间戳格式,仅旧记录存在该问题
疑问解答
格式差异成因
这是HangFire 1.6.x版本的已知bug,早期版本中FailedAt字段的序列化逻辑存在缺陷,导致部分失败任务的时间被序列化为毫秒时间戳而非标准ISO 8601格式。
与DI注册配置的关系
该问题与HangFire的DI注册配置无关,排查过程中未发现Newtonsoft.Json的特殊注册会引发此格式差异。
基础设施变更的影响
不同区域服务器等基础设施变更不会导致此问题,格式差异仅由HangFire版本内部的序列化逻辑缺陷引发。
已完成排查
- 代码中未找到影响日期序列化的Newtonsoft.Json特殊配置
- Git历史与部署记录中未发现相关关键变更
修复方案
执行以下SQL脚本,将时间戳格式的FailedAt字段批量转换为标准ISO 8601格式:
注意:执行前请先查询待更新记录数量,避免批量操作导致服务器过载
update [HangFire].[State] set data = JSON_MODIFY(data, '$.FailedAt', CONVERT(VARCHAR(33), DATEADD(ms, cast(JSON_VALUE (data, '$.FailedAt') as bigint) % 1000, DATEADD(SECOND, cast(JSON_VALUE (data, '$.FailedAt') as bigint) / 1000, '19700101')) , 126) ) where data like '{"FailedAt":"16%' or data like '{"FailedAt":"15%'
内容的提问来源于stack exchange,提问作者user1845593
相关产品推荐
相关产品推荐

