先触发触发器后,CronTrigger的Ne​​xtFireTime不会提前

时间:2019-06-05 16:22:50

标签: c# quartz.net

(免责声明:已经在github.com/quartznet上发布了此内容,但是问题部分对我来说有点孤立了)

在简单的一个调度程序/一个触发器/一个作业环境中使用CronTrigger(“ 0 * / 5 *?* * *”)时,在第一次执行作业后,触发器NextFireTime不会前进,并且会停留在过去。然后,计划的每个作业似乎都会立即执行。

我有一个CronTrigger,它应该每五分钟触发一次作业。该作业是最初计划的。在每五分钟的间隔内,可能会发生一些事件,有必要更新JobDataMap,因此可能会发生许多重新计划。我的经验是,NextFireTime达到“获胜”并执行之前的最后一个(重新)计划作业。我希望每5分钟就会发生一次。

问题:这不是我所看到的。在第一次执行之前,一切似乎都还不错。在此之后,似乎触发器没有前进到我期望的NextFireTime上。相反,它将保留在过去的最后一个。此时,似乎每个计划的作业都立即执行,而不是等待下一个NextFireTime。

在撰写本文期间,我感到依赖密集的重新计划的设计有些糟糕。我真正想要实现的是在触发某些触发器之前捕获一些对象状态,并在Job.Execute()中使用此状态。有更好的方法吗?

到目前为止我尝试过的是: -对Scheduler.ScheduleJob()替换= true -使用一个触发对象与每次重新安排都重新创建它 -在重新计划之前清除计划程序中的所有内容 -带有WithMisfireHandlingInstructionDoNothing()的CronSchedule -确保Job.Execute中没有异常,这可能会导致重新执行

触发定义:

jobExecutionTrigger = TriggerBuilder.Create()
                        .WithIdentity("trigger1", "group1")
                        .WithCronSchedule("0 */5 * ? * * *", 
                            cs => cs.WithMisfireHandlingInstructionDoNothing())
                        .Build();

初始“工作模板”

jobTemplate = JobBuilder.Create<SendWeeklyReminderMailJob>()
    .WithIdentity("job1", "group1")
    .Build();

_ = theScheduler.ScheduleJob(jobTemplate,
    Triggers,
    false);

因为JobDataMap需要更新而重新计划:

var job = jobTemplate.GetJobBuilder().SetJobData(jobData).Build();
jobExecutionTrigger = jobExecutionTrigger.GetTriggerBuilder().Build();

theScheduler.Clear();
_ = theScheduler.ScheduleJob(job,
    new List<ITrigger> {jobExecutionTrigger}.AsReadOnly(),
    true);

我已经执行了一些日志记录,以查看发生了什么事

2019-06-05 13:34:51,021 Result reminder: clearing previous scheduled job / rescheduling job.. 
2019-06-05 13:34:51,024 Result reminder: next reminder will be sent at 05.06.2019 13:35:00
2019-06-05 13:34:51,600 Result reminder: clearing previous scheduled job / rescheduling job..
2019-06-05 13:34:51,603 Result reminder: next reminder will be sent at 05.06.2019 13:35:00 

在到达第一个NextFireTime(13:35:00)之前,一切对我来说都很好。

然后,我的工作第一次执行是在13:35:01:

2019-06-05 13:35:01,053 executing job...
2019-06-05 13:35:03,994 Result reminder: clearing previous scheduled job / rescheduling job..
2019-06-05 13:35:03,999 Result reminder: next reminder will be sent at 05.06.2019 13:35:00 <-- starting from here, NextFireTime is in the past
2019-06-05 13:35:04,009 executing job...

作业运行无一例外,所以我的期望是,计划在13:35:00之后进行的每个作业都首先在13:40:00运行(CronTrigger的值为“ 0 * / 5 *?* * *”)

相反,我看到NextFireTime已经过去了。我认为,因此,每个计划的作业都会立即执行。

0 个答案:

没有答案