繁体   English   中英

阻止 HangFire 在不同服务器上多次运行作业?

[英]Stop HangFire from running a job multiple times on different servers?

我设置了一个重复性工作,它只处理一些订单:

                    {
                        RecurringJob.AddOrUpdate(
                            hangFireJob.JobId,
                            () => hangFireJob.Execute(),
                            hangFireJob.Schedule);
                    }

我遇到的问题是我们有多个“备份”服务器都运行相同的代码。 他们都在访问同一个 HangFire 数据库。

我看到同一个作业运行了多次,这显然给我们带来了错误,因为订单已经处理完毕。

我希望备份服务器能够识别重复作业已经排队,而不是再次排队。 我认为它会 go 关闭作业名称来执行此操作(上面的第一个参数)。 我在这里想念什么?

我在下面包含了hangfire服务器设置:

        private IEnumerable<IDisposable> GetHangfireServers()
        {
            var configSettings = new Settings();
            GlobalConfiguration.Configuration
                               .UseNinjectActivator(_kernel)
                               .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                               .UseSimpleAssemblyNameTypeSerializer()
                               .UseRecommendedSerializerSettings()
                               .UseSqlServerStorage(configSettings.HangfireConnectionString, new SqlServerStorageOptions
                               {
                                   CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                                   SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                                   QueuePollInterval = TimeSpan.Zero,
                                   UseRecommendedIsolationLevel = true,
                                   DisableGlobalLocks = false,
                                   SchemaName = "LuxAdapter",
                                   PrepareSchemaIfNecessary = false
                               });

            yield return new BackgroundJobServer();
        }```

不确定您是否已经尝试过,但考虑在作业上使用DisableConcurrentExecution属性,以防止多次执行同一作业。

由于默认值仅在进程级别提供唯一性,因此如果您想在同一进程中运行不同的服务器实例,则应手动处理它:

var options = new BackgroundJobServerOptions
{
    ServerName = String.Format(
    "{0}.{1}",
    Environment.MachineName,
    Guid.NewGuid().ToString())
};

var server = new BackgroundJobServer(options);
// or
app.UseHangfireServer(options);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM