我有一个使用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
我只是注意到filterContext.BackgroundJob.Job.ToString()
会给出与内部 TypeExtensions.cs 和 DisableConcurrentExecutionAttribute.cs 相同的字符串(重新)实现会......问题解决了。
@dgaspar ,您可以告诉循环作业调度程序跳过下一个循环作业的创建,当前一个仍在运行时,请参阅此要点: https :
感谢@odinserj 的建议。 我注意到如果工作进程在执行过程中崩溃,“运行”行将保留在哈希表中。 它会阻止重新安排作业,直到我手动删除该行吗? 或者是否有我遗漏的过期/清理? (顺便说一句,我正在使用new SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) }
,如果这很重要)
当在后台作业执行期间一个 worker 被终止时,该后台作业将被自动重新调度,因为所有消息队列都是事务性的(至少是官方的,其他存储实现应该以相同的方式运行)。
最有用的评论
@dgaspar ,您可以告诉循环作业调度程序跳过下一个循环作业的创建,当前一个仍在运行时,请参阅此要点: https :