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);

posted @ 2024-08-12 21:19  C余L小R鱼  阅读(109)  评论(0编辑  收藏  举报