2018-06-05 09:04
@杜福忠 你把计划任务,把动态参数放到库中,动态装载Cron4jKit.put()方法中的指令,接下来就是做个开关实时动态开启或关闭,异常问题就会出来了,为什么?
答:案例重现环境=数据库+tomcat+做界面ui动态人机控制计划任务;引起问题原因,是Cron4jKit,现在把scheduler,放到MAPCP,当你Cron4jKit.put()来回装载任务时,调用Cron4jKit.stop(String name)这个方法时,这个scheduler原则上讲已被kill,但Cron4jKit中做了一层包裹:MAPCP,所以MAPCP还存在着已经关闭计划任务的一具尸体留在里(注:当调用Cron4jKit.stop()方法时,相关计划任务已经关闭,但在MAPCP保存还存着scheduler对象的对象实例,最重点的这个被关闭实例对象中变量:started=false,当started为flase,在cron4j源码一这层已经我做状态的判断,当如started=false就抛出throw new IllegalStateException("Scheduler not started");这个异常出来。),这样在put()方法中,第一行调用Cron4jKit.stop(),如果不加MAPCP.remove(name);做处理,就会报上面提到异常,是否明白?如果还是不明白或未感知到的话,要是那就哪天你真发现了,再调整优化吧。
2018-06-04 11:57
@杜福忠 直接贴码给你了, 把你的两个stop方法加下 MAPCP.remove(name),代码如下。
public static void stop(String name) {
Scheduler scheduler = get(name);
if (scheduler != null) {
scheduler.stop();
MAPCP.remove(name);
}
}
public static void stop() {
for (Map.Entry kv : MAPCP.entrySet()) {
kv.getValue().stop();
MAPCP.remove(kv.getKey());
}
}