问题
spring项目中需要调用quartz,其中配置文件中需要用到org.springframework.scheduling.quartz.CronTriggerFactoryBean包,但显示包不存在。
解决
一、初探
一阵百度后发现需要在pom文件中加入如下配置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
进入spring-context-support里面有如下代码,在调用函数的过程中需要调用这里面的方法,只需要大致了解一下就行了。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.19.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
新的问题
本来应该是加入spring-context-support就行了,但是由于我习惯性的调用最新的版本,即
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
但是spring-boot-starter-parent又使用的是1.5版本,而不是2.0版本,这在调用CronTriggerFactoryBean包时报错,如下所示:
2019-01-10 09:02:55 ERROR - An error occured instantiating job to be executed. job= 'scheduler_group.scheduler'
org.quartz.SchedulerException: Job instantiation failed
at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:47) ~[spring-context-support-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127) [quartz-2.3.0.jar:?]
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:392) [quartz-2.3.0.jar:?]
Caused by: java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.accessibleConstructor(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
at org.springframework.scheduling.quartz.AdaptableJobFactory.createJobInstance(AdaptableJobFactory.java:61) ~[spring-context-support-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:43) ~[spring-context-support-5.1.3.RELEASE.jar:5.1.3.RELEASE]
... 2 more
2019-01-10 09:02:55 INFO - All triggers of Job scheduler_group.scheduler set to ERROR state.
这时请不要百度啊,google之类的操作,程序员需要自己从报错信息中找代码的bug!!
解决
注意以上报错代码中“Caused by: java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.accessibleConstructor(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;”,这表示方法没有找到,是哪个方法呢?下一行代码“at org.springframework.scheduling.quartz.AdaptableJobFactory.createJobInstance(AdaptableJobFactory.java:61)”就告诉你出错的地址,ctrl+左键单击进入AdaptableJobFactory.java类,对比发现是5.1.3版本去调用4.3.19版本的方法,因此报错,去掉 pom中的5.1.3.RELEASE即可。
总结
1、spring的版本需要注意
2、百度、google虽好,但是日志与报错信息更重要,它是直观反映你错误点的提示,慢慢积累,以后一眼就可以看穿问题所在。