Quartz与Spring集成——启动调度器
Posted 泰山不老生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quartz与Spring集成——启动调度器相关的知识,希望对你有一定的参考价值。
前言
在《Quartz与Spring集成——创建调度器》一文中介绍了调度器的创建过程,本文将分析其启动过程。熟悉Spring原理的人都知道AbstractApplicationContext的refresh方法的重要性,在refresh方法中调用了finishRefresh方法,最后会调用到SchedulerFactoryBean的start方法,其调用栈如图1所示。
图1 SchedulerFactoryBean的start方法的调用栈
根据图1的内容,我们知道spring容器初始化完毕的最后会启动所有的bean,SchedulerFactoryBean的start方法就是这时候被调用的。
启动调度器
SchedulerFactoryBean的start方法的实现见代码清单1所示。
代码清单1
@Override
public void start() throws SchedulingException {
if (this.scheduler != null) {
try {
startScheduler(this.scheduler, this.startupDelay);
}
catch (SchedulerException ex) {
throw new SchedulingException("Could not start Quartz Scheduler", ex);
}
}
}
startScheduler方法的实现,见代码清单2。
代码清单2
protected void startScheduler(final Scheduler scheduler, final int startupDelay) throws SchedulerException {
if (startupDelay <= 0) {
logger.info("Starting Quartz Scheduler now");
scheduler.start();
}
else {
//此分支启动一个后台线程,sleep参数startupDelay指定的秒数后,再启动调度器(即调用scheduler.start()),主要用于延迟启动
}
}
startScheduler方法中的第二个条件分支用于延迟启动调度器,即当参数startupDelay大于0时,启动一个后台线程,睡眠(sleep)参数startupDelay指定的秒数后,再启动调度器(即调用scheduler.start();)。由于实际上也是执行scheduler.start();故此没有列出其代码。
以默认的Scheduler实现类StdScheduler为例,其start方法的实现如下:
public void start() throws SchedulerException {
sched.start();
}
根据
《Quartz与Spring集成——创建调度器》一文的内容我们知道,这里的sched实际是QuartzScheduler的实例,其start方法的实现见代码清单3。
代码清单3
以上是关于Quartz与Spring集成——启动调度器的主要内容,如果未能解决你的问题,请参考以下文章