Hangfire: 如何在不使作业失败的情况下跳过并发执行

创建于 2017-07-11  ·  4评论  ·  资料来源: HangfireIO/Hangfire

我有一个使用DisableConcurrentExecution(timeout:0) (0 次重试)的重复性工作,因为在给定时间应该只有一个工作人员处理它,特别是如果工作需要一分钟以上才能完成(它会有所不同)。

我不希望“跳过”作业被标记为failed仪表盘上的,所以我想添加一个SkipConcurrentExecutionAttribute ,这将是几乎等同于DisableConcurrentExecutionAttribute ,除它会尝试/捕获锁定获取,并吞下DistributedLockTimeoutException并将作业设置为DeletedState并说明原因。

但是我不能正确地做到这一点,因为GetResource()是私有的,它的实现引用了库内部的其他方法。
$"{job.Type.ToGenericTypeString()}.{job.Method.Name}"似乎是生成不冲突的分布式锁名称的安全方式,但我无法参考它。
我们可以在 lib 中有一个公共方法来生成作业的分布式锁名称吗?

参见, https://discuss.hangfire.io/t/disableconcurentexecution-for-job-groups/1389/4

question

最有用的评论

@dgaspar ,您可以告诉循环作业调度程序跳过下一个循环作业的创建,当前一个仍在运行时,请参阅此要点: https :

所有4条评论

我只是注意到filterContext.BackgroundJob.Job.ToString()会给出与内部 TypeExtensions.cs 和 DisableConcurrentExecutionAttribute.cs 相同的字符串(重新)实现会......问题解决了。

@dgaspar ,您可以告诉循环作业调度程序跳过下一个循环作业的创建,当前一个仍在运行时,请参阅此要点: https :

感谢@odinserj 的建议。 我注意到如果工作进程在执行过程中崩溃,“运行”行将保留在哈希表中。 它会阻止重新安排作业,直到我手动删除该行吗? 或者是否有我遗漏的过期/清理? (顺便说一句,我正在使用new SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) } ,如果这很重要)

当在后台作业执行期间一个 worker 被终止时,该后台作业将被自动重新调度,因为所有消息队列都是事务性的(至少是官方的,其他存储实现应该以相同的方式运行)。

此页面是否有帮助?
0 / 5 - 0 等级