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)这个方法,先来看看该方法的源码说明
意思是:暂停匹配到的组中所有的触发器(暂停之后,对于后面加入该组的新的触发器都会强制设置为暂停状态,直到设置恢复触发)
解决办法:scheduler提供了一个resumeTriggers方法,可以批量恢复某个组中的所有触发器
在每次设置好属于之前暂停的触发器组中的新触发器后,调用scheduler.resumeTriggers(triggerMatcher),恢复该组中的触发器,即可解决。