news 2026/6/10 10:25:35

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/6/10 7:50:50

转行网安别光练技术!合规知识是企业安全刚需,运维入门更轻松

很多运维转行网安时,只关注 “技术攻击与防御”(如渗透测试、漏洞挖掘),却忽视了 “合规知识”—— 而合规是企业安全的 “底线要求”,也是网安岗位的 “刚需技能”。随着《网络安全法》《数据安全法》《个人信息保护法…

作者头像 李华
网站建设 2026/6/10 7:52:31

.NET微服务架构:从开发到部署全指南

你列出的这些技术栈(.NET Core、RabbitMQ、EF Core、Web API、TCP、Swagger、Linux、Docker)构成了一个典型的现代化微服务或分布式系统开发环境。下面我为你简要梳理它们各自的角色,并提供一些整合建议和最佳实践:1. .NET Core&a…

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

基于51单片机自动吸尘粉笔擦黑板压力检测风扇除尘设计DIY套件127(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于51单片机自动吸尘粉笔擦黑板压力检测风扇除尘设计DIY套件127(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 51单片机黑板自动吸尘粉笔擦压力检测风扇除尘127产品功能描述: 本系统由STC89C52单片机、拨动开关、…

作者头像 李华
网站建设 2026/6/10 8:55:06

基于51单片机智能洗手器干手器红外人体感应风扇烘干设计套件149(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于51单片机智能洗手器干手器红外人体感应风扇烘干设计套件149(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码51单片机智能红外洗手器干手器风扇烘干系统149 产品功能描述: 本系统由STC89C52单片机、继电器控制、…

作者头像 李华
网站建设 2026/6/10 8:58:59

基于MSP430单片机超低功耗温度计温度检测报警系统设计/DIY套件4(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于MSP430单片机超低功耗温度计温度检测报警系统设计/DIY套件4(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 MSP430单片机超低功耗温度计检测报警系统4产品功能描述: 本系统由MSP430F149单片机核心、LCD1602液晶…

作者头像 李华