使用SpringBoot 2集成Quartz和RabbitMQ是一件非常简单非常方便的事情,甚至可以达到了零配置运行,大大方便了我们的使用。但是过于智能化也带来了一个问题,就是在控制的时候不太好控制。比如我的项目里集成了Quartz,但是需要部署到不同的服务器上,其中一个服务器需要运行Quartz,另一个服务器则不要运行Quartz。众所周知,像Quartz和RabbitMQ这类框架,在集成到SpringBoot之后, 都是会自动运行的,但是不可能要我打包不同的配置到不同的服务器上吧。
经过查看代码,发现此类自运行的框架都是实现了spring的SmartLifecycle接口,详看:Spring SmartLifecycle 在容器所有bean加载和初始化完毕执行,发现有个方法:
/**
* 根据该方法的返回值决定是否执行start方法。<br/>
* 返回true时start方法会被自动执行,返回false则不会。
*/
public boolean isAutoStartup() {
// 默认为false
return true;
}
这个方法就是关键了。根据解释,当此方法返回false时,不会自动执行start()方法。
1.首先查看Quartz。说到Quartz,肯定从核心类看起。我们知道任务的启动与暂停都跟QuartzScheduler有关,所以先从QuartzScheduler的start()方法看起。通过debug,往上一直找到SchedulerFactoryBean
//---------------------------------------------------------------------
// Implementation of SmartLifecycle interface
//---------------------------------------------------------------------
@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);
}
}
}
可以看到是实现了SmartLifecycle接口。那就简单了,直接去找isAutoStartup方法,看