我正在尝试让 Quartz 与 Spring Boot 一起工作,但无法使注入(inject)正常工作。我以 here 所示的示例为基础
这是我的引导类:
@ComponentScan
@EnableAutoConfiguration
public class MyApp {
@Autowired
private DataSource dataSource;
@Bean
public JobFactory jobFactory() {
return new SpringBeanJobFactory();
}
@Bean
public SchedulerFactoryBean quartz() {
final SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setJobFactory(jobFactory());
bean.setDataSource(dataSource);
bean.setConfigLocation(new ClassPathResource("quartz.properties"));
...
return bean;
}
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
当 Spring 调用 quartz()
方法时,dataSource
为 null
。但是,如果我将 quartz()
方法的返回类型更改为 Object
,则 dataSource
会正确注入(inject)通过读取 创建的数据源>application.properties
,bean 已构建,一切正常,我收到一个后续错误,指出 Quartz 无法从数据库检索任何作业,这是正常的,因为我还没有将架构放置到位.
我尝试在 quartz()
方法上添加 @DependsOn("dataSource")
注释,但这没有任何区别。
该类是唯一用@Configuration
注释的类。
这是我的依赖项(我正在使用 Maven,但由于空间原因这样呈现它们):
org.springframework.boot:spring-boot-starter-actuator:1.0.0.RC4
org.springframework.boot:spring-boot-starter-jdbc:1.0.0.RC4
org.springframework.boot:spring-boot-starter-web:1.0.0.RC4
org.quartz-scheduler:quartz:2.2.1
org.springframework:spring-support:2.0.8
还有父级:
org.springframework.boot:spring-boot-starter-parent:1.0.0.RC4
最后是quartz.properties
的内容:
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class=org.springframework.scheduling.quartz.LocalDataSourceJobStore
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
我做错了什么?
(我见过 this 问题,但该问题初始化 @Configuration
类中的数据源)
最佳答案
如果我使用“org.springframework:spring-context-support:4.0.2.RELEASE”(“org.springframework:spring-support:2.0.8”,您的应用程序将启动(出现架构错误,这是预期的) “如果它曾经存在的话,现在肯定已经有近 10 年的历史了,并且肯定与 Boot 或 Quartz 2 不兼容)。
关于spring - 将 Quartz 与 Spring Boot 结合使用 - 注入(inject)顺序根据方法的返回类型而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541071/