我已经加入对作业的属性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会尝试多次运行它。
我当然可以提上工作的属性,以确保它不会重试的。但是,这不是一个有效的解决方案,因为我希望作业能够被重做,除非由于同时运行而失败。
你能澄清你的两个段落。对不起,但我有点困惑。 – jtabuloc