Я добавил атрибут 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 попытается запустить его несколько раз.
Я мог бы, конечно, поместить атрибут в Работу, гарантируя, что он не будет вообще Retry. Однако это не является допустимым решением, потому что я хочу, чтобы задания были повторены, за исключением случаев, когда они не работают из-за одновременного запуска.
Можете уточнить два абзаца. Извините, но я немного смущен. – jtabuloc