Кварцевый триггер складывается, когда первый триггер занят - PullRequest
0 голосов
/ 14 июля 2020

У меня есть второй триггер с WithMisfireHandlingInstructionDoNothing:

var trigger = TriggerBuilder.Create()
   .WithIdentity("trigger1", "group1")
   .WithCronSchedule("0/1 0/1 0/1 1/1 * ? *", x => x.WithMisfireHandlingInstructionDoNothing())
   .StartNow()
   .Build();

со следующим JobDetail:

var jobDetail = JobBuilder.Create<TestJob>()
   .WithIdentity(JobKey.Create("TestJob")).Build();

и TestJob с DisallowConcurrentExecution:

[DisallowConcurrentExecution] 
public class TestJob : IJob
{
    private static int counter;

    public Task Execute(IJobExecutionContext context)
    {
        var threadId = Thread.CurrentThread.ManagedThreadId;

        Console.WriteLine($"Job start on thread: {threadId}. datetime: {DateTime.Now}");
        if (counter++ < 3)
        {
            Console.WriteLine("Sleeping.");
            Thread.Sleep(5000);
        }

        Console.WriteLine($"Job END on thread: {threadId}. datetime: {DateTime.Now}");

        return Task.CompletedTask;
    }
}

и вот как инициализируется планировщик:

var scheduler = new StdSchedulerFactory().GetScheduler().GetAwaiter().GetResult();
scheduler.ScheduleJob(jobDetail, trigger);
scheduler.Start();

Результат, который я получаю:

Job start on thread: 6. datetime: 14/07/2020 9:45:15
Sleeping.
Job END on thread: 6. datetime: 14/07/2020 9:45:20
Job start on thread: 12. datetime: 14/07/2020 9:45:20
Sleeping.
Job END on thread: 12. datetime: 14/07/2020 9:45:25
Job start on thread: 15. datetime: 14/07/2020 9:45:25
Sleeping.
Job END on thread: 15. datetime: 14/07/2020 9:45:30
Job start on thread: 13. datetime: 14/07/2020 9:45:30
Job END on thread: 13. datetime: 14/07/2020 9:45:30
Job start on thread: 15. datetime: 14/07/2020 9:45:30
Job END on thread: 15. datetime: 14/07/2020 9:45:30
Job start on thread: 12. datetime: 14/07/2020 9:45:30
Job END on thread: 12. datetime: 14/07/2020 9:45:30
Job start on thread: 6. datetime: 14/07/2020 9:45:30
Job END on thread: 6. datetime: 14/07/2020 9:45:30
Job start on thread: 13. datetime: 14/07/2020 9:45:30
Job END on thread: 13. datetime: 14/07/2020 9:45:30
Job start on thread: 14. datetime: 14/07/2020 9:45:30
Job END on thread: 14. datetime: 14/07/2020 9:45:30
Job start on thread: 15. datetime: 14/07/2020 9:45:30
Job END on thread: 15. datetime: 14/07/2020 9:45:30
Job start on thread: 14. datetime: 14/07/2020 9:45:30
Job END on thread: 14. datetime: 14/07/2020 9:45:30
Job start on thread: 15. datetime: 14/07/2020 9:45:30
Job END on thread: 15. datetime: 14/07/2020 9:45:30
Job start on thread: 6. datetime: 14/07/2020 9:45:30
Job END on thread: 6. datetime: 14/07/2020 9:45:30
Job start on thread: 14. datetime: 14/07/2020 9:45:30
Job END on thread: 14. datetime: 14/07/2020 9:45:30
Job start on thread: 13. datetime: 14/07/2020 9:45:30
Job END on thread: 13. datetime: 14/07/2020 9:45:30
Job start on thread: 14. datetime: 14/07/2020 9:45:30
Job END on thread: 14. datetime: 14/07/2020 9:45:30
Job start on thread: 13. datetime: 14/07/2020 9:45:31
Job END on thread: 13. datetime: 14/07/2020 9:45:31
Job start on thread: 6. datetime: 14/07/2020 9:45:32
Job END on thread: 6. datetime: 14/07/2020 9:45:32

Как видите, задание не одновременно, что хорошо. но чего я не хочу, так это того, чтобы триггер второго задания складывался, пока задание спит в первых трех запусках. После трех запусков все триггеры, которые сложены, срабатывают сразу после друг друга. начиная с 14/07/2020 9:45:30 задание вызывается не менее 15 раз. Я не хочу такого поведения. Я не хочу, чтобы эти вызовы складывались, пока задание занято.

Я думал, что могу использовать WithMisfireHandlingInstructionDoNothing для этого, но это не имеет никакого эффекта.

Надеюсь, это ясно , спасибо за любую помощь.

EDIT

Вероятно, misfireThreshold связан с тем, что я получаю. Как это настроить в C#?

1 Ответ

1 голос
/ 14 июля 2020

Как вы указали, проблема заключается в пороге пропусков зажигания.

Если этот тайм-аут не истек, триггер не считается пропущенным, поэтому вам необходимо уменьшить его.

Вы можете сделать это:

NameValueCollection props = new NameValueCollection
{
    .....,
    { "quartz.jobStore.misfireThreshold", "1000" },
    .....
};
StdSchedulerFactory factory = new StdSchedulerFactory(props);

Но это зависит от способа настройки вашего экземпляра кварца.

Если вы используете файл конфигурации, вы можете добавить:

quartz.jobStore.misfireThreshold = 1000
...