Quartz中的scheduler删除重设定时任务后,定时任务不生效

307 阅读1分钟
public static void removeJobs() throws SchedulerException {
    GroupMatcher<JobKey> jobMatcher = GroupMatcher.groupEquals(JobGroupName);
    Set<JobKey> jobKeySet = scheduler.getJobKeys(jobMatcher);
    if (jobKeySet.size() == 0){
        return;
    }
    List<JobKey> jobKeyList = new ArrayList<>(jobKeySet);
    GroupMatcher<TriggerKey> triggerMatcher = GroupMatcher.groupEquals(TriggerGroupName);
    Set<TriggerKey> triggerKeySet = scheduler.getTriggerKeys(triggerMatcher);
    List<TriggerKey> triggerKeyList = new ArrayList<>(triggerKeySet);

    scheduler.pauseTriggers(triggerMatcher);//停止触发器
    scheduler.unscheduleJobs(triggerKeyList);//移除触发器

    scheduler.deleteJobs(jobKeyList);//删除任务
    System.out.println("移除定时任务!!!");
}

首先创建并开启scheduler,设置定时任务,定时任务能够正常执行

scheduler = StdSchedulerFactory.getDefaultScheduler();
startScheduler();

然后调用上面的removeJobs()方法移除掉scheduler对象中的定时任务,然后用该scheduler关联新的定时任务,在不重启项目的情况下,发现新关联的任务不会再定时触发执行。

问题原因: 关键在于scheduler.pauseTriggers(triggerMatcher)这个方法,先来看看该方法的源码说明

image.png

意思是:暂停匹配到的组中所有的触发器(暂停之后,对于后面加入该组的新的触发器都会强制设置为暂停状态,直到设置恢复触发)

解决办法:scheduler提供了一个resumeTriggers方法,可以批量恢复某个组中的所有触发器

image.png

在每次设置好属于之前暂停的触发器组中的新触发器后,调用scheduler.resumeTriggers(triggerMatcher),恢复该组中的触发器,即可解决。