2016-09-29 89 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雖然 - 儘管這已經是必要的工作在所有的工作。