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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-08-12 数据库设计--范式原则