I solved this problem. I hope it works for you
public class PreventConcurrentExecutionJobFilter : JobFilterAttribute, IClientFilter, IServerFilter
{
public void OnCreating(CreatingContext filterContext)
{
var jobs = JobStorage.Current.GetMonitoringApi().ProcessingJobs(0, 100);
if (jobs.Count(x => x.Value.Job.Type == filterContext.Job.Type && string.Join(".", x.Value.Job.Arguments) == string.Join(".", filterContext.Job.Arguments)) > 0)
{
filterContext.Canceled = true;
}
}
public void OnPerformed(PerformedContext filterContext) { }
void IClientFilter.OnCreated(CreatedContext filterContext) { }
void IServerFilter.OnPerforming(PerformingContext filterContext) { }
}
Usings:
- Add to global filters
GlobalJobFilters.Filters.Add(new PreventConcurrentExecutionJobFilter());
- or by Abstract base job class
[PreventConcurrentExecutionJobFilter]
public abstract class IHangfireJob {
}
- or by Single job
[PreventConcurrentExecutionJobFilter]
public class MyJob {
}