2016-09-29 54 views
1

我正在使用hangfire将作业分配给多个服务器(它们位于不同的机器上)。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; 
      } 
     } 
    } 
} 

它只是托管服务器,并显示基于用户输入的一些信息。

+0

你正在讨论将'server'推向全局范围还是将其注入到每个作业中?为什么不使用IOC(http://docs.hangfire.io/en/latest/background-methods/using-ioc-containers.html),在该容器中注册'BackgroundJobServer'并从那里解析所有作业(通过ctor-injection或服务定位器模式)?请参阅http://docs.hangfire.io/en/latest/background-methods/passing-dependencies.html –

+0

@AndreasNiedermair,我不太了解您的建议。这些作业是在完全不同的应用程序(一个Web API)中创建和排队的,我的服务器是在不同机器上运行的控制台应用程序。 Hangfire然后在后台处理作业,但在工作班级中,我没有提及服务器 - 事实上,他们甚至不知道服务器,甚至连Hangfire都没有... – EluciusFTW

+0

所以你不是在说话关于'server'作为你的_server_,而是物理实体? –

回答

0

这样我就可以解决这个问题了:在定义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虽然 - 尽管这已经是必要的工作在所有的工作。