问题背景
项目上使用的springboot版本是2.1.1.RELEASE
,现在因为要接入elasticsearch7.x版本,参考官方文档要求,需要将springboot版本升级到2.5.14
。
本以为是改一下版本号的事,但是升级之后发现服务启动报错了😱。
问题原因
Caused by: org.quartz.SchedulerConfigException: DataSource name not set.
从错误信息中可以看出,报错与quartz
有关,我们先来顺着异常栈看一下,可以看到是JobStoreSupport.initialize()
方法中抛出的错误:
public void initialize(ClassLoadHelper loadHelper,
SchedulerSignaler signaler) throws SchedulerConfigException {
if (dsName == null) {
throw new SchedulerConfigException("DataSource name not set.");
}
...
}
向上溯源可以发现,其初始调用方是这里:
那么这个js
对象是什么呢?它是一个JobStore
实例,而JobStore
其实是一个接口,它有多个实现类:
我们先来打断点看看,这里实际使用到的是哪个类的实例,先将springboot版本改回到2.1.1.RELEASE
看看,可以看到使用的是LocalDataSourceJobStore
,而当我们使用springboot2.5.14
版本时,这里使用的是JobStoreTX
是实例化对象。
那么,是什么原因导致两个版本使用了不同的JobStore
实现类呢?先来看看js
对象是如