Hangfire 多台服务器

Posted

技术标签:

【中文标题】Hangfire 多台服务器【英文标题】:Hangfire Multiple servers 【发布时间】:2018-07-24 01:54:43 【问题描述】:

我正在构建一个 .net 核心 Web 应用程序,在服务器端我正在为计划任务和长期运行任务添加 hangfire。在我添加的 Startup.cs 文件中:

services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));

在配置函数中我添加了这个:

app.UseHangfireServer();
app.UseHangfireDashboard();

现在的问题是,每当我运行应用程序时,仪表板中都会显示一个新的服务器实例。

有没有办法确保只有一个服务器在运行?或者我可以在停止应用程序 (IIS) 时关闭服务器并在运行应用程序时重新启动它

【问题讨论】:

稍等片刻后旧实例应该被移除。 真的...感谢您的回答 【参考方案1】:

这似乎解决了一些问题。它应该清除过去 15 秒内未激活的所有服务器。我目前有这是我的应用程序startup.cs。感觉不是正确的解决方案,但受到他们提供的东西的限制。

        // Clean up Servers List
        Hangfire.Storage.IMonitoringApi monitoringApi = JobStorage.Current.GetMonitoringApi();
        JobStorage.Current.GetConnection().RemoveTimedOutServers(new TimeSpan(0, 0, 15));

        app.UseHangfireServer(new BackgroundJobServerOptions
        
            WorkerCount = 1,
            Queues = new[]  "jobqueue" ,
            ServerName = "HangfireJobServer",
        );

        RecurringJob.AddOrUpdate("ProcessJob", () => YourMethod(), AppSettings.JobCron, TimeZoneInfo.Local, "jobqueue");

【讨论】:

【参考方案2】:

根据Hangfire ASP.NET Core Applications的当前版本 在public void Configure() 内调用app.UseHangfireServer() 是不必要的(至少文档不包括它)

改为public void ConfigureServices(IServiceCollection services) 使用

services.AddHangfire
services.AddHangfireServer

这应该消除第二个服务器实例

【讨论】:

【参考方案3】:

您应该为每台服务器创建一个单独的队列。请看这个页面:Single Dashboard, Single Physical Server, Multiple Jobs

【讨论】:

以上是关于Hangfire 多台服务器的主要内容,如果未能解决你的问题,请参考以下文章

WCF 客户端代理在被 hangfire 工作人员服务使用时陷入故障状态

Hangfire.io仪表板映射到IIS虚拟目录

c# .net core使用Hangfire组件来管理自动定时任务,连接的是redis服务,现在问题是占用内存太大

如何在类方法中触发hangfire而不向触发它发送请求

Hangfire入门(任务调度)

ABP集成Hangfire