我遇到这样的情况,我需要向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)
这样做的问题是,所有作业都在要出现的第一个服务器上执行,被标记为已完成,因此其他服务器未执行。
有什么方法可以确保作业在所有服务器上运行?
还是有办法确保只有一台服务器可以处理给定的工作?即将作业定位到创建它的服务器上
使用此链接找到了答案。
只需将作业分配到特定于您要对其进行处理的服务器的队列。
因此,我将队列更改为:
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)
| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |