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内部的重试是如何工作的?每分钟做一次重复性工作重试将并行运行?
我想答案是是只要他们有员工可以执行你的工作。
我怎么知道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());