我已经在作业上添加了一个属性
这使我能够检测作业是否因为与同一作业的另一个实例同时运行而失败。问题是,我找不到一种方法来取消这个特定的失败作业并将其从重新运行中删除。现在,该作业将被放入重试计划,并且Hangfire将尝试运行它多次。
当然,我可以在作业上放置一个属性,确保它根本不重试。然而,这不是一个有效的解决方案,因为我希望作业重试,除非它们由于并发运行而失败。
DisableConcurrentExecution(1)
,但这只是延迟第二个实例的执行,直到第一个实例完成。我希望能够检测到并取消同时运行的作业。
我想,如果DisableConcurrentExecution(1)
可以防止同时运行相同的循环作业,它会将第二个作业放置在“重试”状态下,从而改变其状态。因此,我在作业上添加了其他自定义属性,用于检测失败状态,如下所示:
public class StopConcurrentTask : JobFilterAttribute, IElectStateFilter
{
public void OnStateElection(ElectStateContext context)
{
var failedState = context.CandidateState as FailedState;
if(failedState != null && failedState.Exception != null)
{
if(!string.IsNullOrEmpty(failedState.Exception.Message) && failedState.Exception.Message.Contains("Timeout expired. The timeout elapsed prior to obtaining a distributed lock on"))
{
}
}
}
}
这使我能够检测作业是否因为与同一作业的另一个实例同时运行而失败。问题是,我找不到一种方法来取消这个特定的失败作业并将其从重新运行中删除。现在,该作业将被放入重试计划,并且Hangfire将尝试运行它多次。
当然,我可以在作业上放置一个属性,确保它根本不重试。然而,这不是一个有效的解决方案,因为我希望作业重试,除非它们由于并发运行而失败。