仅使用@Scheduled注解时,Spring Boot能否写入Quartz表并实现集群单实例运行?
问题:Spring Boot 2.7.4中@Scheduled注解能否结合Quartz实现集群单实例执行任务?
之前手动配置过Quartz,现在想借助Spring Boot 2.7.4的自动配置能力,期望仅通过@Scheduled注解就能把任务/触发器持久化到数据库的Quartz表中,实现集群环境下多实例仅单个实例执行任务的效果。
已配置的Quartz参数:
spring.quartz.scheduler-name=super-duper-scheduler spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.job-store-type=jdbc spring.quartz.properties.org.quartz.job-store.class=org.quartz.impl.jdbcjobstore.LocalDataSourceJobStore spring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_ spring.quartz.properties.org.quartz.jobStore.isClustered = true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval = 20000
定时任务代码:
@Scheduled(cron = "0 */20 * * * *") public void updateVendorInfoFromSam() { // 业务逻辑处理 }
启动后Quartz调度器初始化日志正常,但Quartz数据库表(如QRTZ_TRIGGERS)中没有持久化任务和触发器数据(数据源未开启自动提交)。
核心疑问:
仅通过@Scheduled注解配置Spring任务,是否能基于Quartz实现集群单实例运行的效果?
解答:
不能。@Scheduled是Spring原生的任务调度实现,和Quartz属于两个独立的调度体系,Spring Boot的自动配置不会将@Scheduled注解的任务自动转交给Quartz调度器管理,因此这些任务不会被持久化到Quartz的数据库表中,自然无法利用Quartz的集群机制实现单实例执行。
要达成你的需求,需要改用Quartz的API定义Job和Trigger,或者通过Spring提供的QuartzJobBean、SchedulerFactoryBean等组件整合Quartz,让Spring将任务交付给Quartz调度器处理,这样才能借助Quartz的JDBC存储和集群能力实现预期效果。
另外,数据源未开启自动提交的问题,需要确保Quartz使用的数据源配置了自动提交,或者在Quartz配置中开启对应事务处理,否则任务数据无法正常写入数据库。
内容的提问来源于stack exchange,提问作者jholder
相关产品推荐
相关产品推荐

