news 2026/10/6 6:32:41

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/10/6 3:33:05

别信 35 岁魔咒!实施和运维并非青春饭,谣言该戳破了

在IT行业,“35岁危机”像一道悬在头顶的达摩克利斯之剑,让不少从业者焦虑:自己的岗位到底是不是“吃青春饭”?其中,实施工程师和运维工程师这两个高频出现在招聘需求里的岗位,常被拿来比较——有人说实施要…

作者头像 李华
网站建设 2026/10/6 3:32:47

51单片机红外避障视力保护器坐姿提醒防近视纠正26(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

51单片机红外避障视力保护器坐姿提醒防近视纠正26(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码产品功能描述: 本系统由STC89C52单片机、红外避障模块、光敏电阻、蜂鸣器报警、LED灯及电源组成。 1、通过红外避障…

作者头像 李华
网站建设 2026/10/6 3:33:03

基于51单片机红外非接触人体测温温度补偿无线摄像头设计套件91(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于51单片机红外非接触人体测温温度补偿无线摄像头设计套件91(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 51单片机便携式红外非接触人体测温仪阈值报警91产品功能描述: 本系统由STC89C52单片机、lcd1602液晶、…

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

Unsloth模型合并:LoRA权重整合详细步骤

Unsloth模型合并:LoRA权重整合详细步骤 1. unsloth 简介 你是否在为大语言模型(LLM)微调时显存占用高、训练速度慢而烦恼?Unsloth 正是为此而生。它是一个开源的 LLM 微调和强化学习框架,专注于提升训练效率与资源利…

作者头像 李华