hangfire recurring job on every server

邮差的信 提交于 2019-12-01 04:19:33

问题


I have a situation where I need a recurring job registered with hangfire to run on every server in the cluster.

(The job is to copy some files locally so needs to run on every server regularly)

So far I have tried registering the same job with an id of the server name resulting in n job for n servers:

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

and the job itself checks if it is the correct server and only does something if it is:

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

        // do stuff here if it matches our taskname
}

The problem with this is that all jobs executes on the first server to come along, is marked as complete and as a result is not executed by the other servers.

Is there any way to ensure that the job runs on all servers?

or is there a way to ensure that only one server can process a given job? i.e. target the job at the server that created it


回答1:


Found an answer using this link.

Simply assign the job to a queue that is specific to the server you want it processing on.

So I changed my enqueue to:

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

And when I start my server I do this:

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


来源:https://stackoverflow.com/questions/42201809/hangfire-recurring-job-on-every-server

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!