Quartz 更新调度不生效
前提
调度表中已有一个日历调度计划 jobkey为triggerKey,因为系统时间出错 导致NEXT_FIRE_TIME不对 想通过更新调度来修正NEXT_FIRE_TIME 更新不生效
踩坑(一) 使用StartNow 而不是 StartAt
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(jobName, groupName)
.ForJob(jobKey)
.WithCronSchedule(config.DateTimeUpdateTime)
.StartNow()
.Build();
Scheduler.RescheduleJob(triggerKey, trigger);
StartNow意味立即生效 但是quartz发现库里触发器时间 比当前时间更早 认为原有触发器仍然有效 基于旧的计划计算NEXT_FIRE_TIME 导致NEXT_FIRE_TIME无法修正
解决
修改为StartAt(DateTimeOffset.Now) 显示设置为当前时间执行
// 创建并调度新的触发器
ITrigger newTrigger = TriggerBuilder.Create()
.WithIdentity(triggerKey) // 确保使用相同的触发器标识符
.ForJob(jobKey)
.WithCronSchedule(config.DateTimeUpdateTime) // 使用新的Cron表达式
.StartAt(DateTimeOffset.Now) // 显式设置为当前时间
.Build();
踩坑(一) 使用StartAt 修改cron 改变不生效
在cron没变的情况下可以修正NEXT_FIRE_TIME 但当 Cron变化时 就得触发器未做修改 QRTZ_CRON_TRIGGERS中对应cron没有更新 NEXT_FIRE_TIME 也没有修正
排查原因:
cron表达式格式错误 默认使用原触发器
解决
修正cron
终极解决方式
先删除旧的触发器 再重新创建新的触发器
// 删除旧的触发器
await scheduler.UnscheduleJob(triggerKey);
// 创建并调度新的触发器
ITrigger newTrigger = TriggerBuilder.Create()
.WithIdentity(triggerKey) // 确保使用相同的触发器标识符
.ForJob(jobKey)
.WithCronSchedule(config.DateTimeUpdateTime) // 使用新的Cron表达式
.StartAt(DateTimeOffset.Now) // 显式设置为当前时间
.Build();
await scheduler.ScheduleJob(newTrigger);