Hangfire禁止同一作业多实例同时运行问题排查
阻止Hangfire同一作业同时运行多个实例
我有一个配置了Hangfire(v1.8.7)的ASP.NET Core MVC 8 Web应用,用于执行多个作业。偶尔某个作业会超出指定时间,进而触发另一个实例。我的目标是阻止Hangfire同时启动同一作业的多个实例。
我仅运行了一个服务器
我尝试使用DisableConcurrentExecution属性,但并未生效。
作业配置代码
[DisableConcurrentExecution(timeoutInSeconds: (3600))] public ActionResult SetScheduledJob_SyncModifiedItemsFromAffiliateBox() { RecurringJob.AddOrUpdate("SyncModifiedItemsFromAffiliateBox_OffHours", () => SyncModifiedItemsFromAffiliateBoxJob(), Cron.Minutely()); return RedirectToAction("index"); } public void SyncModifiedItemsFromAffiliateBoxJob() { Thread.Sleep(2 * 60 * 1000); }
Program.cs配置代码
// Add Hangfire services. builder.Services.AddHangfire(configuration => configuration .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) .UseSimpleAssemblyNameTypeSerializer() .UseRecommendedSerializerSettings() .UseSqlServerStorage(appSettings.GetConnectionString("HangfireConnection"))); // Add the processing server as IHostedService builder.Services.AddHangfireServer();
app.UseHangfireDashboard(); app.MapHangfireDashboard();
问题原因及解决办法
你把DisableConcurrentExecution属性加错了位置——它应该作用在实际执行的作业方法上,而不是用来添加定时任务的调度方法上。Hangfire的并发控制属性需要绑定到真正运行业务逻辑的方法,也就是SyncModifiedItemsFromAffiliateBoxJob,而非SetScheduledJob_SyncModifiedItemsFromAffiliateBox。
修改后的代码如下:
public ActionResult SetScheduledJob_SyncModifiedItemsFromAffiliateBox() { RecurringJob.AddOrUpdate("SyncModifiedItemsFromAffiliateBox_OffHours", () => SyncModifiedItemsFromAffiliateBoxJob(), Cron.Minutely()); return RedirectToAction("index"); } [DisableConcurrentExecution(timeoutInSeconds: 3600)] public void SyncModifiedItemsFromAffiliateBoxJob() { Thread.Sleep(2 * 60 * 1000); }
额外优化建议:
- 若想彻底避免作业重叠,可在添加定时任务时指定
MisfireHandlingMode.IgnoreNew,这样当作业仍在运行时,新的触发请求会直接被忽略,不会进入等待队列:RecurringJob.AddOrUpdate( "SyncModifiedItemsFromAffiliateBox_OffHours", () => SyncModifiedItemsFromAffiliateBoxJob(), Cron.Minutely(), misfireHandlingMode: MisfireHandlingMode.IgnoreNew); - 单服务器场景下,上述配置已足够保证并发控制;后续若扩展多服务器,该属性也能跨服务器生效,阻止同一作业同时执行。
内容的提问来源于stack exchange,提问作者Akour Mohamed
相关产品推荐
相关产品推荐

