2017-02-13 22 views
3

У меня есть ситуация, когда мне требуется повторяющаяся работа, зарегистрированная с помощью hangfire для запуска на каждом сервере в кластере.hangfire повторяющаяся работа на каждом сервере

(задание скопировать некоторые файлы локально, поэтому потребность регулярно работать на каждом сервере)

До сих пор я пытался регистрировать ту же работу с идентификатором имени сервера, в результате п задания для п серверов:

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 
} 

проблема с этим состоит в том, что все рабочие места execut es на первом сервере, который должен совпадать, помечается как завершенный и в результате не выполняется другими серверами.

Есть ли способ гарантировать, что задание выполняется на всех серверах?

или есть способ гарантировать, что только один сервер может обрабатывать задание? т.е. задайте задание на сервере, который его создал

+0

Я искал противоположность этому, но вопрос, помог мне, как вы сказал, что это возможно. – Zapnologica

ответ

3

Нашел ответ, используя this link.

Просто присвойте задание очереди, которая относится к серверу, на котором вы хотите его обработать.

Так что я изменил мою Ставить на:

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

И когда я начинаю свой сервер я делаю это:

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

Будьте осторожны, когда это задание повторится, оно возвращается в очередь «по умолчанию»! Если вы не используете атрибут, как показано здесь: https://github.com/HangfireIO/Hangfire/pull/502 –