【发布时间】:2016-10-14 22:39:41
【问题描述】:
我正在使用 hangfire 将作业分发到多个服务器(它们位于不同的机器上)。
有时作业会失败,因为处理它的机器/服务器未处于就绪状态(例如,作业使用的应用程序已崩溃等)。现在我想以编程方式关闭服务器,以便它不接受更多工作并且可以修复。我该如何做到这一点,因为所有代码都在不知道服务器的作业类中运行,并且所有服务器代码都托管了一个 hangfireserver 实例?
更具体地说,我的服务器应用程序如下所示:
class Program {
static void Main(string[] args) {
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection");
var serverOptions = new BackgroundJobServerOptions {
WorkerCount = 1
};
using (var server = new BackgroundJobServer(serverOptions)) {
ConsoleHelpers.ConfigureConsole();
ConsoleHelpers.WriteWelcomeMessage();
char userInput = '\0';
while (userInput != 'q') {
if (userInput == 'l') {
ConsoleHelpers.WriteLogFileToConsole();
}
userInput = Console.ReadKey().KeyChar;
}
}
}
}
它只是托管服务器并根据用户输入显示一些信息。
【问题讨论】:
-
您是在谈论将
server推送到全局范围,还是将其注入到每个作业中?为什么不使用 IOC (docs.hangfire.io/en/latest/background-methods/…),在该容器中注册BackgroundJobServer并从那里解决所有作业(通过 ctor-injection 或服务定位器模式)?见docs.hangfire.io/en/latest/background-methods/… -
@AndreasNiedermair,我不太明白你的提议。这些作业是在完全不同的应用程序(Web API)中创建和排队的,我的服务器是在不同机器上运行的控制台应用程序。 Hangfire 然后在后台处理作业,但在作业类中我没有对服务器的引用 - 事实上他们甚至根本不知道服务器,甚至不知道 Hangfire...
-
所以您不是在谈论
server作为您的服务器,而是物理实体? -
@AndreasNiedermair 好吧,两者都对混淆感到抱歉:我的意思是,只要物理服务器处于不健康状态,我想(关闭/退出循环)hangfire 服务器。我的 hangfire 作业在物理服务器上启动其他应用程序,当作业因应用程序崩溃而失败时,我需要管理员来修复物理服务器。它不应再接受作业,因此作业应停用当前正在处理的 hangfire 服务器。