我在.Net中使用Quartz。 不管我设置了“ quartz.jobStore.misfireThreshold”,还是将失火策略设置为忽略,我仍然看到作业正在执行。
理想情况下,这永远都不会发生。
我已经为相同的对象初始化了JobListener和Trigger侦听器 这是我的片段
var props = new NameValueCollection
{
{ "quartz.serializer.type", "binary" },
{"quartz.threadPool.threadCount","1" },
{"quartz.jobStore.misfireThreshold","3000" }
};
var schedulerFactory = new StdSchedulerFactory(props);
// get a scheduler
var scheduler = await schedulerFactory.GetScheduler();
//scheduler.CheckExists()
await scheduler.Start();
var job3 = JobBuilder.Create<HelloJob>()
.WithIdentity("myJob3", "group3")
.UsingJobData("jobSays", "Hello World 333333")
.UsingJobData("myFloatValue", 9.423f)
.Build();
var trigger3 = TriggerBuilder.Create()
.WithIdentity("trigger3", "group3")
.WithSimpleSchedule(x => x
.WithMisfireHandlingInstructionIgnoreMisfires())
.StartAt(DateTimeOffset.UtcNow)
.Build();
await scheduler.ScheduleJob(job3, trigger3);
答案 0 :(得分:1)
.WithMisfireHandlingInstructionIgnoreMisfires()
会尽快触发所有错过的触发器,然后返回普通时间表。您应该使用.WithMisfireHandlingInstructionDoNothing()
,在显式设置为“ MISFIRE_INSTRUCTION_DO_NOTHING”的失火指令处理程序中进行触发,这意味着所有失火的执行都将被丢弃,它只是在等待下一个预定时间。如果触发器“错过”其触发时间,则会发生失火,因为Quartz的线程池中没有可用的线程来执行作业