Could not start Quartz Scheduler after delay
The Scheduler cannot be restarted after shutdown() has been called.
报错代码:
Exception in thread "Quartz Scheduler [schedulerFactoryBean]" org.springframework.scheduling.SchedulingException: Could not start Quartz Scheduler after delay; nested exception is org.quartz.SchedulerException: The Scheduler cannot be restarted after shutdown() has been called.
at org.springframework.scheduling.quartz.SchedulerFactoryBean$1.run(SchedulerFactoryBean.java:754)
Caused by: org.quartz.SchedulerException: The Scheduler cannot be restarted after shutdown() has been called.
at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:529)
at org.quartz.impl.StdScheduler.start(StdScheduler.java:142)
at org.springframework.scheduling.quartz.SchedulerFactoryBean$1.run(SchedulerFactoryBean.java:751)
报错原因无外乎就是Scheduler中的shutdown()和start()启动时出现冲突问题
我这出错的原因就是你延迟时间太长,shutdown()后又来start(),最后就变成那个线程没有了,你居然还去start()。于是bug大佬就提前出头了。
解决方法
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(jobFactory);
// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
schedulerFactoryBean.setOverwriteExistingJobs(true);
// 延长启动
schedulerFactoryBean.setStartupDelay(10);
return schedulerFactoryBean;
}
其中的
schedulerFactoryBean.setStartupDelay(10);
在做定时器的时候表示延迟启动。项目启动完成后,等待10秒后开始执行调度器初始化。
如果你在开发的时候使用热部署的情况下很容易出现上面的错。特别是延迟时间越长的情况下不停的启动服务会触发这个bug。
建议在开发的时候 延迟时间短点 或者别在短时间内重复启动服务。
以上情况只供参考
如果是在是使用Scheduler的shutdown方法出错的时候,可以考虑standby()暂停方法。这样就不会出现shutdown后start()的问题,。