2017-02-13 8 views
3

クラスタ内のすべてのサーバでhangfireに登録された定期ジョブが必要な状況があります。hangfireすべてのサーバで繰り返しジョブ

(ジョブはローカルでいくつかのファイルをコピーすることですので、定期的にすべてのサーバー上で実行する必要があります)

は、これまでのところ私は、n個のサーバー用のn個のジョブでその結果、サーバー名のIDと同じジョブを登録しようとしています:

RecurringJob.AddOrUpdate(Environment.MachineName,() => CopyFiles(Environment.MachineName), Cron.MinuteInterval(_delay)); 

およびジョブ自体をチェックし、それが正しいサーバーであり、それがある場合にのみ、何かをする場合:

public static void CopyFiles(string taskId) 
{ 
     if (string.IsNullOrWhiteSpace(taskId) || !taskId.Equals(Environment.MachineName)) 
     { 
      return; 
     } 

     // do stuff here if it matches our taskname 
} 

これで問題は、すべてのジョブのSQLステートメ最初のサーバー上のesが完全であるとマークされ、結果が他のサーバーによって実行されないためです。

ジョブがすべてのサーバーで実行されるようにする方法はありますか。

または1つのサーバーで特定のジョブを処理できるようにする方法がありますか?すなわち、それを作成したサーバでジョブを目標とする。

+0

だから私はに私のエンキューを変更:

RecurringJob.AddOrUpdate(Environment.MachineName, () => CopyFiles(Environment.MachineName), Cron.MinuteInterval(_delay), queue: Environment.MachineName.ToLower(CultureInfo.CurrentCulture)); 

そして、私は私のサーバーを起動するとき、私はこれを行いますその可能性があると述べた。 – Zapnologica

答えて

3

this linkを使用して回答が見つかりました。

ジョブを、処理したいサーバーに固有のキューに割り当てます。私はこれの逆を探していましたが、あなたはあなたのように私を助け質問

_backgroundJobServer = new BackgroundJobServer(new BackgroundJobServerOptions 
          { 
           Queues = new[] { Environment.MachineName.ToLower() } 
          }); 
+1

このジョブが再試行されると、「デフォルト」キューに戻りますので注意してください。次のように属性を使用しない限り、https://github.com/HangfireIO/Hangfire/pull/502 –

関連する問題