Hangfire Jobs运行旧版本代码,无法解析已删除服务报错如何解决?
Hangfire执行已删除旧代码问题修复方案
根因说明
Hangfire的所有任务元数据(包括要执行的类、方法、参数、重试规则)都会持久化保存在你配置的存储介质(SQL Server/Redis/PostgreSQL等)中,仅删除业务代码、移除Startup中的服务注册,不会自动清除已经存在于存储中的待执行旧任务、重试队列中的遗留任务,因此会持续触发依赖注入失败的报错。
修复步骤
- 第一步:清理存储中已存在的旧任务
优先通过Hangfire内置的Dashboard面板操作:进入「待处理」「重试中」「已计划」三个队列,筛选出所有PQATExportHandler、HwsPQATExportHandler相关的任务,手动批量删除。
如果任务量过大,可直接操作底层存储批量清理:- SQL Server存储:找到Hangfire对应的
Job、Set、Queue表,删除字段中包含PQATExport、HwsPQATExport关键字的记录 - Redis存储:删除所有key前缀包含
PQATExport、HwsPQATExport的条目
- SQL Server存储:找到Hangfire对应的
- 第二步:排查移除残留的任务提交代码
全局搜索项目中所有RecurringJob.AddOrUpdate、BackgroundJob.Enqueue、BackgroundJob.Schedule等Hangfire任务提交方法,确认没有残留的PQAT相关任务提交逻辑,避免新的旧任务再次进入队列。 - 第三步:(可选)添加全局过滤器兜底
如果担心有遗漏的旧任务,可以添加Hangfire全局执行过滤器,匹配到旧任务时直接取消执行并删除任务,避免无效重试占用资源:
在Hangfire配置处注册过滤器:using Hangfire.Server; using Hangfire.Common; public class ObsoleteJobFilter : IServerFilter { public void OnPerforming(PerformingContext context) { var jobTypeFullName = context.Job.Type.FullName; // 匹配所有需要废弃的旧任务类 if (jobTypeFullName.Contains("PQATExportHandler") || jobTypeFullName.Contains("HwsPQATExportHandler")) { context.Canceled = true; // 永久删除该任务,不再进入重试队列 BackgroundJob.Delete(context.JobId); } } public void OnPerformed(PerformedContext context) { // 无需实现 } }// .NET 6+ Program.cs 写法 builder.Services.AddHangfire(config => { // 原有Hangfire配置,比如UseSqlServerStorage/UseRedisStorage等 config.UseFilter(new ObsoleteJobFilter()); }); // .NET 5及以下 Startup.cs 写法 services.AddHangfire(config => { // 原有Hangfire配置 config.UseFilter(new ObsoleteJobFilter()); }); - 第四步:重启应用实例
完成上述操作后,重启所有运行Hangfire服务的应用实例,清空内存中缓存的任务数据即可。
内容的提问来源于stack exchange,提问作者Mr.Gomer
相关产品推荐
相关产品推荐

