news 2026/4/26 17:31:00

SpringBoot学习:整合Quartz实现定时任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot学习:整合Quartz实现定时任务

在应用开发中,经常会遇到需要定时执行操作的场景,例如日志清理、邮件发送、订单处理等。SpringBoot支持多种定时任务实现方式,包括Timer、ScheduledExecutorService、SpringTask、Quartz以及xxljob等。本文将重点介绍如何使用Quartz框架实现可靠的定时任务调度。

Quartz定时任务的核心组件

Quartz框架通过以下核心要素构建定时任务系统:

1.任务(Job)定义需要执行的具体操作

2.任务实例(JobDetail)指定要执行的具体任务及其属性

3.触发器(Trigger)定义任务的执行时间计划

4.调度器(Scheduler)协调任务、触发器和执行时间的核心调度组件

5.任务上下文(JobExecutionContext)任务执行时可访问的上下文信息

组件关系说明:

一个Job可以对应多个JobDetail

一个JobDetail可以关联多个Trigger

一个Trigger只能关联一个JobDetail

一、创建任务(Job)

1.两种创建Job类的方式

(1)实现Job接口

Quartz原生接口,更轻量

需要额外配置以支持Spring依赖注入

(2)继承QuartzJobBean抽象类

Spring封装的Job基类

提供更好的Spring集成体验

重要提示:实现Job接口的方式默认不会将Job实例注册到Spring容器中,需要通过自定义AdaptableJobFactory来实现依赖注入。

2.Job相关的两个重要注解

@PersistJobDataAfterExecution

当Job成功执行execute方法后,持久化JobDetail中JobDataMap的数据,确保下一次执行时使用更新后的数据

@DisallowConcurrentExecution

禁止同一Job定义的多个实例并发执行。当任务执行时间超过调度间隔时,可避免重复执行问题

3.代码实现

java

@PersistJobDataAfterExecution

@DisallowConcurrentExecution

publicclassMySaveJobimplementsJob{

//可通过自定义工厂类注入Spring管理的Service

//@Autowired

//privateUserServiceuserService;

@Override

publicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{

System.out.println("需要通过自定义工厂类注入job到容器中");

LocalDateTimenow=LocalDateTime.now();

DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyyMMddHH:mm:ss");

System.out.println("当前执行时间:"+now.format(formatter));

}

}

@Component("myAdaptableJobFactory")

publicclassMyAdaptableJobFactoryextendsAdaptableJobFactory{

@Autowired

privateAutowireCapableBeanFactoryautowireCapableBeanFactory;

@Override

protectedObjectcreateJobInstance(TriggerFiredBundlebundle)throwsException{

//调用父类方法创建Job实例

ObjectjobInstance=super.createJobInstance(bundle);

//将Job实例注入Spring容器

this.autowireCapableBeanFactory.autowireBean(jobInstance);

returnjobInstance;

}

}

二、配置定时任务

通过配置类统一管理JobDetail、Trigger和Scheduler的创建与注册:

java

@Configuration

publicclassMySaveConfig{

//创建JobDetail对象

@Bean

publicJobDetailFactoryBeanjobDetailFactoryBean(){

JobDetailFactoryBeanjobDetailFactoryBean=newJobDetailFactoryBean();

//设置Job类(此时Job实例尚未注入Spring容器)

jobDetailFactoryBean.setJobClass(MySaveJob.class);

returnjobDetailFactoryBean;

}

//创建Trigger对象

@Bean

publicSimpleTriggerFactoryBeansimpleTriggerFactoryBean(

JobDetailFactoryBeanjobDetailFactoryBean

){

SimpleTriggerFactoryBeansimpleTriggerFactoryBean=newSimpleTriggerFactoryBean();

//关联Job对象

simpleTriggerFactoryBean.setJobDetail(

Objects.requireNonNull(jobDetailFactoryBean.getObject())

);

//设置触发时间:每5秒执行一次

simpleTriggerFactoryBean.setRepeatInterval(5000);

//设置重复次数:执行5次

simpleTriggerFactoryBean.setRepeatCount(5);

returnsimpleTriggerFactoryBean;

}

//创建Scheduler对象

@Bean

publicSchedulerFactoryBeanschedulerFactoryBean(

SimpleTriggerFactoryBeansimpleTriggerFactoryBean,

MyAdaptableJobFactorymyAdaptableJobFactory

){

SchedulerFactoryBeanschedulerFactoryBean=newSchedulerFactoryBean();

//添加触发器

schedulerFactoryBean.setTriggers(

simpleTriggerFactoryBean.getObject()

);

//设置自定义JobFactory以支持依赖注入

schedulerFactoryBean.setJobFactory(myAdaptableJobFactory);

returnschedulerFactoryBean;

}

}

总结

通过以上步骤,我们实现了SpringBoot与Quartz框架的完整集成。关键要点包括:

1.选择合适的Job创建方式(Job接口或QuartzJobBean)

2.通过自定义JobFactory解决依赖注入问题

3.合理使用注解控制任务执行行为

4.使用配置类统一管理定时任务组件

这种集成方式既保持了Quartz的强大调度能力,又充分利用了Spring的依赖注入和便捷配置特性,是构建企业级定时任务系统的有效方案。

来源:小程序app开发|ui设计|软件外包|IT技术服务公司-木风未来科技-成都木风未来科技有限公司

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 19:03:52

企业网盘收费吗?企业网盘收费标准

根据《中国企业数字化转型白皮书》的数据显示,超过87%的企业正在积极采用云计算和企业网盘等数字化工具,帮助优化业务流程,提高团队协作效率,并增强数据安全性。 在这个信息化深度渗透各行各业的时代,企业网盘早已不只…

作者头像 李华
网站建设 2026/4/23 10:36:14

芯片适配快讯:合兴软件ISDT完成对旗芯微FC7300的适配

合兴软件HXSC-ISDT(嵌入式软件时间分析工具)正式完成对旗芯微FC7300系列MCU的适配。通过非侵入的方式获取系统时间数据,在不影响系统运行状态的前提下,实现纳秒级精度的性能分析,为车规实时系统调优和问题定位提供了更…

作者头像 李华
网站建设 2026/4/20 9:16:59

高转速搅拌釜源头厂家

高转速搅拌釜优质之选——捷耀智能在众多行业的生产流程中,高转速搅拌釜都起着至关重要的作用。而要找到一家靠谱的高转速搅拌釜源头厂家,江苏捷耀智能装备制造有限公司(简称:捷耀智能)绝对值得关注。捷耀智能已经在不…

作者头像 李华
网站建设 2026/4/25 7:38:25

为什么要启动两个SecretNote?

启动两个 SecretNote 节点是为了模拟真实的隐私计算场景。 1. 隐私计算的核心概念 1.1 多方安全计算(MPC) 隐私计算的核心是多方安全计算,需要至少两个参与方: Alice:持有自己的私有数据 Bob:持有自己的私有数据 双方都不想暴露自己的原始数据 但需要共同计算某个结果…

作者头像 李华
网站建设 2026/4/24 21:27:22

CTF 逆向入门:汇编小白到逆向大神,实操攻略直接照搬

一、入门阶段(2-3 个月):吃透汇编,搞定无壳程序 阶段目标:掌握 x86 汇编基础,能逆向简单 C 语言无壳程序,提取 CTF 逆向入门题 flag。 核心知识点:x86 汇编核心(寄存器…

作者头像 李华