是什么导致 azure 托管的 hangfire 作业表现得像这样?

What causes azure-hosted hangfire jobs to behave like this?

有两个重复性工作(位于列表顶部的那些)让我遇到了一段时间的麻烦,即使它们已安排好,也没有得到 运行。

我可以很好地触发它们,它们会被重新安排,但是当预定时间到来时它们不会 运行,"Next Execution" 时间就这样过去了。

现在有很多其他作业也有同样的问题。这些应该 运行 每小时,但如果他们超过了计划时间,他们就不会 运行。

访问仪表板没有任何区别。 Web 应用程序始终处于打开状态。 Hangfire 永远不会 运行 这些作业,除非我手动触发它们。不处于此状态的工作仍然 运行 每天或每小时都按计划进行。

什么会导致这种情况?

我的 hangfire 实例(版本 1.7.6)在一个设置为始终 运行ning 的 Azure WebApp 中。 它使用 Azure-sql 数据库作为其数据存储。

这是我的 Bootstrapper.cs 代码:

using System.Configuration;
using System.Web.Hosting;
using Hangfire;

namespace MyApi
{
    public class HangfireBootstrapper : IRegisteredObject
    {
        public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();

        private readonly object _lockObject = new object();
        private bool _started;

        private BackgroundJobServer _backgroundJobServer;

        private HangfireBootstrapper()
        {
        }

        public void Start()
        {
            lock (_lockObject)
            {
                if (_started) return;
                _started = true;

                HostingEnvironment.RegisterObject(this);
                var jobOptions = new BackgroundJobServerOptions();
                jobOptions.ServerName = ConfigurationManager.AppSettings.Get("hangfire:servername");
                jobOptions.Queues = new[] {"k1"};

                GlobalConfiguration.Configuration
                    .UseSqlServerStorage("Kdb");

                _backgroundJobServer = new BackgroundJobServer(jobOptions);
            }
        }

        public void Stop()
        {
            lock (_lockObject)
            {
                if (_backgroundJobServer != null)
                {
                    _backgroundJobServer.Dispose();
                }

                HostingEnvironment.UnregisterObject(this);
            }
        }

        void IRegisteredObject.Stop(bool immediate)
        {
            Stop();
        }
    }
}

这是用于对大多数作业进行排队的代码:

jobMgr.AddOrUpdate($"Script.{i1}.{name}", Job.FromExpression(() => HangfireJobs.ReplayQueue.EnqueueScript(scriptId, i1, null)),cronExpression);

下面是我的 EnqueueScript 方法的定义方式:

    [Queue("k1")]
    public static void EnqueueScript(Guid scriptId, int env, PerformContext context)
    {
        try
        {
           ...

已通过将 Hangfire 升级到版本 1.7.8 解决此问题。

Hangfire 错误报告可在 https://github.com/HangfireIO/Hangfire/issues/1459

查看

它似乎是在 1.7.4 版左右引入的(可能更早,但肯定是那时)并在 1.7.8 版中修复。