【发布时间】:2020-07-14 07:51:47
【问题描述】:
我有第二个触发 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
如您所见,工作不是并发的,这很好。但我不想要的是第二个作业触发器在前 3 次运行中睡眠时堆积起来。在 3 次运行之后,所有堆叠的触发器都将立即触发。从14/07/2020 9:45:30 开始,该作业至少被调用了 15 次。这是我不想要的行为。我不希望这些调用在工作繁忙时堆积起来。
我以为我可以为此使用WithMisfireHandlingInstructionDoNothing,但它没有效果。
我希望这很清楚,感谢您的帮助。
编辑
可能the misfireThreshold 与我得到的有关。如何在 C# 中进行配置?
【问题讨论】:
标签: c# quartz-scheduler quartz.net