DisallowConcurrentExecutionAttribute не работает правильно, если используется IJobFactory - PullRequest
0 голосов
/ 08 ноября 2018

Кварц Версия: 2.3.2.0

Ожидаемое поведение

DisallowConcurrentExecutionAttribute добавлено к заданию, задание должно выполняться синхронно.

Фактическое поведение

Задание все еще может выполняться одновременно.

Шаги для воспроизведения

//main
public class MainClass
{
    private readonly IScheduler _scheduler;    

    public MainClass(IScheduler scheduler)
    {
        _scheduler = scheduler;
    }

    _scheduler.ScheduleJob(JobBuilder.Create<ICustomJob>().WithIdentity(JobKey.Create("uniqueKey")).Build(), TriggerBuilder.Create().WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForever(5).StartNow().Build()));
    _scheduler.Start();
}

//NInject Composition Root
kernel.Bind<ICustomJob>().To<CustomJob>().InThreadScope();
kernel.Bind<IScheduler>.ToMethod(GetScheduler(kernel)).InSingletonScope();

private IScheduler GetScheduler(IKernel kernel)
{
    var scheduler = new StdSchedulerFactory().GetScheduler();
    scheduler.JobFactory = new NInjectJobFactory(kernel);
    return scheduler;
}

//NInjectJobFactory
public class NInjectJobFactory : IJobFactory
{
    private readonly IResolutionRoot _resolutionRoot;

    public NInjectJobFactory(IResolutionRoot resolutionRoot)
    {
        _resolutionRoot = resolutionRoot;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return (IJob)_resolutionRoot.Get(bundle.JobDetail.JobType);
    }

    public void ReturnJob(IJob job)
    {
        _resolutionRoot.Release(job);
    }
}

//customJob
public interface ICustomJob : IJob
{

}

[DisallowConcurrentExecutionAttribute]
public class CustomJob : ICustomJob
{
    public void ExecuteJob(IJobExecutionContext context)
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToString("T") + " CustomJob STARTED");
        Thread.Sleep(TimeSpan.FromSeconds(10));
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " " + DateTime.Now.ToString("T") + " CustomJob DONE");
    }
}
...