【问题标题】:Hangfire Recurring job runs every 30 minutes while it's still unfinishedHangfire Recurring 作业每 30 分钟运行一次,但仍未完成
【发布时间】:2021-10-07 02:56:00
【问题描述】:

我正在使用 Hangfire 运行大约需要 2 小时的作业。我注意到每 30 分钟就会重新发生一次工作,而前一个工作仍在工作。因此,如果我的作业 A 在特定时间开始,则 30 分钟后,另一个作业 A 将开始运行,而前一个作业仍处于处理状态。

配置服务():

services.AddHangfire(config => config
        .UseSimpleAssemblyNameTypeSerializer()
        .UseDefaultTypeSerializer()
        .UseMemoryStorage());



        services.AddHangfireServer();

配置():

app.UseHangfireDashboard();

RecurringJob.AddOrUpdate<ISender>(i => i.A(), Cron.Daily(8, 0), timeZone: TimeZoneInfo.Local);

我已经检查了运行的方法是否存在错误、异常等,只是为了确保不会因此重试作业。经过大量测试,我认为并非如此。

任何形式的帮助都将不胜感激

【问题讨论】:

  • 你定义了多少个工人?
  • 您是否考虑过使用DisableConcurrentExecution 来防止执行同一作业的多个实例?
  • 我会尝试 DisablingConcurrentExecution 和关于workers - 我没有改变它,我认为它是20
  • DisableConcurrentExecution 不起作用

标签: asp.net-core hangfire


【解决方案1】:

我不确定这是否正确,但它为我解决了问题。

这是由 ConfigureServices() 中的 UseMemoryStorage() 引起的。

像下面的示例一样传递选项将限制作业在默认情况下在 30 分钟或选项中指示的任何内容后重新发生。

var options = new MemoryStorageOptions
{
    FetchNextJobTimeout = TimeSpan.FromHours(10)
};

services.AddHangfire(config => config.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
  .UseSimpleAssemblyNameTypeSerializer()
  .UseDefaultTypeSerializer()
  .UseMemoryStorage(options));

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多