我正在处理一个asp.net mvc-5 Web应用程序,并且在使用Hangfire工具运行长时间运行的后台作业时遇到了问题。 问题是,如果作业执行时间超过30分钟,则hangfire将自动启动另一个作业,因此我最终将同时运行两个相似的作业。

现在我有以下内容:

  • Asp.net mvc-5
  • IIS-8
  • Hangfire 1.4.6
  • Windows Server 2012

  • 现在,我已定义了一个执行每天一次17:00的hangfire定期作业。后台作业主要扫描我们的网络中的服务器和VM,并更新数据库,而定期作业将在执行完成后发送电子邮件。
    当执行不到30分钟时,该周期性作业通常可以很好地工作。但是今天,随着我们系统的发展,重复性工作在40分钟后完成,而不是过去的22-25分钟。我收到了2封电子邮件,而不是1封电子邮件(这两封电子邮件之间的时间大约为30分钟)。现在,我手动重新运行该作业,并且我注意到该问题如下:-



    现在,如果重复执行的工作少于30分钟(例如29分钟),我将不会遇到任何问题,但是如果重复执行的工作超过30分钟,则由于某种原因或另一个“停火”将启动新的工作。
    尽管在执行作业期间访问hangfire仪表板时,我可以发现只有一个 Activity 作业,但是当我监视数据库时,可以从sql探查器中看到有两个作业正在访问数据库。这种情况是在重复性工作开始30分钟后发生的(在本例中为17:30),这就是为什么我收到2封电子邮件,这意味着2个重复性工作在后台运行,而不是在后台运行。

    因此,任何人都可以对此提出建议,如果当前的重复作业执行时间超过30分钟,如何避免hangfire自动启动新的重复作业?
    谢谢

    最佳答案

    您是否从Hangfire docs看了InvisibilityTimeout设置?


    var options = new SqlServerStorageOptions
    {
        InvisibilityTimeout = TimeSpan.FromMinutes(30) // default value
    };
    
    GlobalConfiguration.Configuration.UseSqlServerStorage("<name or connection string>", options);
    

    Hangfire 1.5 this option is now Obsolete 开始。其他 worker 看不到正在处理的工作。

    10-05 20:30
    查看更多