hangfire重试在reccuringjob中是如何工作的

本文关键字:工作 何工作 重试 reccuringjob hangfire | 更新日期: 2023-09-27 18:27:09

我用Hangfire的递归作业来做我的长进程,每分钟有一个cron表达式(所以基本上它每分钟运行一次,在数据库中获取数据并进行一些处理),当它失败时,我用Handfire实现重试3。

问题:

  • Hangfire内部的重试是如何工作的?每分钟重复作业和重试是否并行运行
  • 我如何知道3的重试是否已经完成或已经达到(在代码中)

我想知道是否已经达到重试的原因是,我需要对Hangfire的重复作业正在处理的数据库中的数据做些什么。

注意:查看仪表板以了解重试不是我的选择,而是通过代码。有可能吗?

实施:

public class HangfireImpl
    {
        public static void ConfigureHangfire(IAppBuilder app, string dashBoardName, string connectionString)
        {
            GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 3 });
            GlobalConfiguration.Configuration
                    .UseSqlServerStorage(connectionString)
                    .UseDashboardMetric(SqlServerStorage.ActiveConnections)
                    .UseDashboardMetric(SqlServerStorage.TotalConnections)
                    .UseDashboardMetric(DashboardMetrics.FailedCount);
            app.UseHangfireDashboard(string.Format(@"/{0}", dashBoardName));
            app.UseHangfireServer();
        }
        public static void InitializeJobs()
        {
            // is there a way to find out how many retry occured inside my service.Execute?
            RecurringJob.AddOrUpdate<Worker>(service => service.Execute(), Cron.Minutely);
        }
    }

hangfire重试在reccuringjob中是如何工作的

我可能已经解决了自己的问题。

问题:

Hangfire内部的重试是如何工作的?每分钟做一次重复性工作重试将并行运行?

我想答案是只要他们有员工可以执行你的工作。

我怎么知道3的重试是否已经完成或达到已经(在代码中)?

我实现了JobFilterAttribute和IElectStateFilter,并使用hangfire:的全局过滤器进行注册

public class JobStateFilter : JobFilterAttribute , IElectStateFilter 
{
     public void OnStateElection(ElectStateContext context)
     {
          var failedState = context.CandidateState as FailedState;
           if (failedState == null) return;
          // I capture failed context here after 3 retry              
     }
}
GlobalJobFilters.Filters.Add(new JobStateFilter());