尽管将失火策略设置为“ IGNORE”,但失火的简单触发器仍在执行作业

时间:2018-06-25 13:22:42

标签: c# quartz.net quartz

我在.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);

1 个答案:

答案 0 :(得分:1)

.WithMisfireHandlingInstructionIgnoreMisfires()会尽快触发所有错过的触发器,然后返回普通时间表。您应该使用.WithMisfireHandlingInstructionDoNothing(),在显式设置为“ MISFIRE_INSTRUCTION_DO_NOTHING”的失火指令处理程序中进行触发,这意味着所有失火的执行都将被丢弃,它只是在等待下一个预定时间。如果触发器“错过”其触发时间,则会发生失火,因为Quartz的线程池中没有可用的线程来执行作业