2016-09-29 14 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

「サーバー」をグローバルスコープにプッシュすること、またはすべてのジョブ内にそれを挿入することについて話していますか? IOC(http://docs.hangfire.io/en/latest/background-methods/using-ioc-containers.html)を使用して、そのコンテナで 'BackgroundJobServer'を登録し、そこからすべてのジョブを解決してください(via ctor-injectionまたはサービスロケータパターン)? @docs.hangfire.io/en/latest/background-methods/passing-dependencies.html –

+0

@AndreasNiedermair、私はあなたの提案を本当に理解していません。ジョブは全く異なるアプリケーション(Web API)で作成され、キューに入れられ、サーバーは異なるマシン上で実行されるコンソールアプリケーションです。 Hangfireはバックグラウンドでジョブを処理しますが、ジョブクラスではサーバへの参照はありません。実際には、サーバのことはまったく知らなくても、Hangfireのものではありません。 – EluciusFTW

+0

あなたは話していませんあなたの_server_として 'server'については、物理的なエンティティですか? –

答えて

0

この方法でこの問題を解決できました。ジョブを定義するクラスでは、静的プロパティを定義できます。これは、どのようなタイプのものとすることができる - 私はここで、文字列の例をあげてみましょう:

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を参照してください。

関連する問題