每个服务器上的hangfire周期性作业

Mik*_*keW 4 c# hangfire

我遇到这样的情况,我需要向hangfire注册的定期作业才能在群集中的每个服务器上运行。

(工作是在本地复制一些文件,因此需要定期在每台服务器上运行)

到目前为止,我已经尝试使用服务器名称的ID注册相同的作业,导致n个服务器的n个作业:

RecurringJob.AddOrUpdate(Environment.MachineName, () => CopyFiles(Environment.MachineName), Cron.MinuteInterval(_delay));
Run Code Online (Sandbox Code Playgroud)

作业本身会检查它是否是正确的服务器,并且仅在以下情况下才执行某些操作:

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

        // do stuff here if it matches our taskname
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,所有作业都在要出现的第一个服务器上执行,被标记为已完成,因此其他服务器未执行。

有什么方法可以确保作业在所有服务器上运行?

还是有办法确保只有一台服务器可以处理给定的工作?即将作业定位到创建它的服务器上

Mik*_*keW 6

使用此链接找到了答案。

只需将作业分配到特定于您要对其进行处理的服务器的队列。

因此,我将队列更改为:

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

当我启动服务器时,请执行以下操作:

_backgroundJobServer = new BackgroundJobServer(new BackgroundJobServerOptions 
                           {
                               Queues = new[] { Environment.MachineName.ToLower() } 
                           });
Run Code Online (Sandbox Code Playgroud)