【问题标题】:Hangfire automatically starting all recurring jobs after prod deployment产品部署后,Hangfire 自动启动所有重复作业
【发布时间】:2020-04-30 02:36:03
【问题描述】:

我在生产中遇到了一个严重的 Hangfire 问题,这种问题偶尔会发生,但非常令人担忧。

我在 .Net Core 2.1 中使用 Hangfire

部署我的 Hangfire 作业后,我的所有重复作业都会自动启动,这不是我所期望的。有没有其他人注意到这一点?

我无法解决这个问题,请帮助 提前致谢。

【问题讨论】:

  • 提供有关您的代码和启动配置的更多详细信息。
  • 这是我的启动配置,我觉得很普通services.AddHangfire(x => { x.UseSqlServerStorage(Configuration.GetConnectionString("Hangfire"), new Hangfire.SqlServer.SqlServerStorageOptions { QueuePollInterval = TimeSpan.FromMinutes(1) }); x.UseLog4NetLogProvider(); x.UseRecurringJob($"recurringjob.{env}.json"); });
  • 这是我的配置启动仪表板,也很常见app.UseHangfireServer(new BackgroundJobServerOptions { Queues = new[] { "DEFAULT", "SECONDARY" } }); app.UseHangfireDashboard("/hangfire", new DashboardOptions { Authorization = new[] { new HangfireAuthorizationFilter() } });
  • 我的意思是将它们放入您的问题中,以免您的问题被否决。更高质量的问题会带来更快的答案。

标签: c# asp.net .net asp.net-core hangfire


【解决方案1】:

根据我的经验,这通常是因为之前的作业失败了,所以 Hangfire 会在有机会时自动重试它们。 (您可以通过在数据库中查找Failed 状态的工作来检查是否属于这种情况。)

如果需要,有一些方法可以修改此行为:

如果您不希望重试作业,请放置一个具有 0 最大重试尝试值的显式属性:

[AutomaticRetry(Attempts = 0)]
public void BackgroundMethod()
{
}

使用相同的方式将尝试次数限制为不同的值。如果要更改默认全局值,请添加新的全局过滤器:

GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 5 });

如果您使用的是 ASP.NET Core,则可以使用 IServiceCollection 扩展方法 AddHangfire。请注意,AddHangfire 使用 GlobalJobFilter 实例,因此依赖项应该是 Transient 或 Singleton。

services.AddHangfire((provider, configuration) =>
{
   configuration.UseFilter(provider.GetRequiredService<AutomaticRetryAttribute>());
}

参考:Dealing with exceptions

【讨论】:

  • 感谢您的建议,但我检查了作业自动启动时没有异常。
猜你喜欢
  • 2017-03-09
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2018-02-23
  • 2012-03-23
  • 1970-01-01
  • 2019-01-08
  • 2021-01-24
相关资源
最近更新 更多