【问题标题】:Hangfire - access server from job?Hangfire - 从工作访问服务器?
【发布时间】: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 服务器。

标签: c# .net hangfire


【解决方案1】:

这样我就可以解决这个问题:在定义 Job 的类中,我可以定义一个静态属性。这可以是任何类型 - 让我在这里举一个字符串示例:

namespace MyJobProject {
   public class MyJob() {
       public static string message {get; private set;} = "Hello!";
       // other code in the job class
   }
}

然后在服务器代码中我可以访问该属性,因为它是静态的,即在我可以编写的原始问题中的 while 循环中

while (userInput != 'q') {
    if (userInput == 'l') {
        ConsoleHelpers.WriteLogFileToConsole();
    }
    userInput = Console.ReadKey().KeyChar;
    Console.Writeline(MyJob.Message);
}

请记住引用命名空间 MyJobProject - 尽管这对于作业的工作来说已经是必要的了。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2018-07-24
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多