这是我的 Quartz 配置:
<quartz>
<add key="quartz.scheduler.instanceName" value="EmailScheduler" />
<!-- Configure Thread Pool -->
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<!-- Configure Job Store -->
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz" />
<add key="quartz.jobStore.dataSource" value="default" />
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
<add key="quartz.dataSource.default.provider" value="SqlServer-20" />
<add key="quartz.dataSource.default.connectionString" value="data source= ......" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
</quartz>
这是我的IInterruptableJob
:
public class JobC : Quartz.IInterruptableJob
{
public void Interrupt()
{
Console.WriteLine("Job Interrupt() called at " + DateTime.Now);
}
public void Execute(IJobExecutionContext context)
{
// what code I should write here to detect misfires???
Console.WriteLine("FireTime at " + context.FireTimeUtc.Value + " PreviousFireTime at:" + (context.PreviousFireTimeUtc.HasValue ? context.PreviousFireTimeUtc.Value.ToString() : "NULL"));
}
}
这是我的工作和触发器:
var job = JobBuilder.Create<JobC>().WithIdentity(new JobKey("JobC")).RequestRecovery(true).Build();
var trigger = TriggerBuilder.Create()
.WithSimpleSchedule(x => x
.RepeatForever()
.WithIntervalInSeconds(2)
// I'm ignoring misfires here, but seems it doesn't work!
.WithMisfireHandlingInstructionIgnoreMisfires())
.StartNow()
.Build();
var scheduler = new Quartz.Impl.StdSchedulerFactory().GetScheduler();
scheduler.Start();
scheduler.ScheduleJob(job, trigger);
在我调用 scheduler.PauseAll()
之后,所有作业都暂停,在调用 scheduler.ResumeAll()
之后,所有未触发的任务都被解雇了!但我想忽略它们,从现在开始继续。
提前致谢。
最佳答案
您确定您的触发器符合定义的失火阈值吗?如果您的配置状态为 60 秒的阈值,则每个未被视为未触发但已达到预定触发时间的触发器将在恢复后尽快触发。
因此,如果您的暂停持续时间达到最小阈值(在本例中为 60 秒),您应该会看到忽略行为。
关于c# - 如何忽略 Quartz.Net 中的失火?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13264115/