news 2026/4/16 11:18:44

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/16 7:46:28

Kubernetes平滑部署全景实战指南

在Kubernetes中实现平滑部署(亦称无损发布或零宕机部署)的核心原理在于:必须确保新Pod已启动并通过就绪检查、能够接收流量后,再终止旧Pod。若这一顺序被打破,则可能引发服务闪断、请求丢失或短暂不可用。 一、实现平…

作者头像 李华
网站建设 2026/4/16 11:05:36

什么网盘能够解决超大文件传输难题?

一、超大文件传输为何成为难题?现代社会的数字化程度从未像今天这样深刻影响我们的生活和工作。先做一个简单的思维试验:每次需要传输视频文件、设计素材、数据库备份或者超大文档时,你是不是曾经历过以下这些问题?电子邮件容量有…

作者头像 李华
网站建设 2026/4/10 6:50:51

口碑好的高转速搅拌釜供应商

行业口碑王——高转速搅拌釜供应商怎么选?在化工、锂电、医药、食品等众多行业的生产过程中,高转速搅拌釜这类设备起着关键作用。一个口碑好的高转速搅拌釜供应商,不仅能提供优质的设备,更能为企业的生产运营提供坚实保障。那该如…

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

采访稿怎么整理?牢记这7个关键步骤

采访结束后,对着几小时的录音逐字整理成稿,不仅耗时长还容易遗漏关键信息 —— 这是很多人做采访稿时的痛点。其实只要掌握 7 步流程,就能高效产出一篇结构清晰、重点突出的高分采访稿,过程中还能借助语音转文字工具降低整理成本。…

作者头像 李华
网站建设 2026/3/31 0:01:40

网络协议解析实战指南

数据包解析(Packet Analysis)是网络流量分析、安全审计和协议逆向工程中的关键技术,常用于识别通信内容、检测异常行为或进行故障排查。下面分别简要介绍你提到的常见协议(Telnet、FTP、SSH、VNC、RDP)以及工控协议&am…

作者头像 李华