如何确保在Web场中仅安排一次Hangfire作业

问题描述 投票:1回答:1

每次部署应用程序时,我都会删除所有重复的作业,并按如下所示重新添加它们:

JobStorage.Current.GetConnection().GetRecurringJobs().ForEach(x => RecurringJob.RemoveIfExists(x.Id));
....
MyJobs.ForEach(x => RecurringJob.AddOrUpdate<....

我需要这样做来解决激活问题,因为在每次部署时我都更改了程序集的版本号,并且在部署了“ MyAssembly,2.0.0.0”之后,带有“ MyAssembly,1.0.0.0”的原始记录不再能正确激活,因此在每个发行版(实际上是每个App Pool重新启动)之后,我都会删除重复的作业并重新安排它们的时间。一切都很好。

我希望开始在Web场中运行我的作业,我希望此代码删除作业并将其重新添加到每个“环境”一次,而不是每个hangfire服务器一次,因此几台服务器没有竞争并一遍又一遍地添加相同的工作。

我可能可以通过web.config设置将一个实例指定为“领导者”,只有领导者可以执行工作计划,但是如果我的“领导者”在部署后没有上线怎么办。我也希望所有配置文件都相同,而不必在CD pipiline中将其中一个配置为“领导”。

处理此情况的最佳方法是什么-Hangfire是否内置任何内容?

asp.net jobs hangfire
1个回答
0
投票

请看Hangfire.RecurringJobCleanUpManager。它可能会为您提供一个示例,说明如何处理重新安排的周期性作业。

引擎盖下没有魔术。它基本上会获取所有当前的重复作业,删除那些不再存在于代码中的“计划的”(在库中:已强制执行),然后添加那些在代码中但在获取当前重复的作业时未出现的作业。

这是您可以看到的与您已完成的工作差不多的工作,恰好打包成几个类。除非您要手动篡改Hangfire的元数据以更新程序集名称,版本等,否则没有其他方法。

© www.soinside.com 2019 - 2024. All rights reserved.