是什么原因导致天蓝色托管的hangfire作业具有这种行为?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是什么原因导致天蓝色托管的hangfire作业具有这种行为?相关的知识,希望对你有一定的参考价值。

Recurring job schedule

我已经遇到了一段时间的麻烦,尽管有两个定期执行的任务(此列表顶部的任务)即使已安排也无法运行。

我可以很好地触发它们,并且将它们重新安排,但是当安排时间到了时,它们就不会运行,并且“下一次执行”时间就过去了。

现在还有许多其他工作都遇到相同的问题。这些应该每小时运行一次,但是如果超过计划时间,它们就不会运行。

访问仪表板没有区别。网络应用程序始终处于打开状态。除非我手动触发,否则Hang​​fire永远不会运行这些作业。仍然处于这种状态的作业每天或每小时仍能按计划运行。

什么原因造成的?

我的hangfire实例(版本1.7.6)位于已设置为始终运行的Azure WebApp中。 See, it's always running!它使用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已解决此问题。

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

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

以上是关于是什么原因导致天蓝色托管的hangfire作业具有这种行为?的主要内容,如果未能解决你的问题,请参考以下文章

HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...

应用程序池回收后,Hangfire 重复作业停止

当 Hangfire 并行处理多个作业时,为啥 MySQL InnoDB 会产生如此多的死锁?

带有 SQL Server 2019 Express 的 Windows Server 2019 上的 Hangfire

如何访问失败的Hangfire作业

在没有数据库存储的情况下使用 HangFire 进行后台作业处理?