欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Springboot整合quartz实现定时任务

Springboot整合quartz实现定时任务

2025/2/2 0:21:16 来源:https://blog.csdn.net/qq_64734490/article/details/143992064  浏览:    关键词:Springboot整合quartz实现定时任务

前言

Quartz实现定时任务的Api对应关系图 

概念及实现步骤图:

 

 实现步骤

1.引入依赖

  <!--quartz 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>

2.配置Quartz

在config文件夹下,创建一个QuartzConfig.java的配置类

package com.cczj.config;
import com.cczj.job.MyJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;// 该类用于配置Quartz定时任务相关的组件,通过Spring的配置类方式进行定义
@Configuration
public class QuartzConfig {// 定义一个JobDetail类型的Bean,用于描述定时任务的具体细节信息@Beanpublic JobDetail jobDetail() {// 使用JobBuilder来构建JobDetail对象,指定要执行的任务类为MyJob.classreturn JobBuilder.newJob(MyJob.class)// 设置任务为持久化存储,意味着即使没有与之关联的触发器,任务定义也会保留在调度器中.storeDurably()// 为任务指定一个唯一标识,包括名称("job1")和所属组名("group1"),用于在调度器中区分不同的任务.withIdentity("job1", "group1")// 为任务添加一段描述信息,方便后续查看任务相关信息时了解其功能或用途.withDescription("这是MyJob的描述")// 向任务的JobDataMap中添加一个键值对,键为"jobCount",值为1,JobDataMap可用于在任务执行过程中传递数据.usingJobData("jobCount", 1).build();}// 定义一个Trigger类型的Bean,用于设定定时任务的触发规则,即何时执行任务@Beanpublic Trigger trigger() {// cron表达式,用于定义任务执行的时间规则,这里的表达式表示每3秒执行一次任务// 格式依次为:秒 分 时 日 月 周 年(年可省略,此处用?占位表示不指定)String cronExpression = "0/3 * * * *? *";// 使用TriggerBuilder来构建Trigger对象return TriggerBuilder.newTrigger()// 为触发器指定一个唯一标识,包括名称("trigger1")和所属组名("group1"),用于在调度器中区分不同的触发器.withIdentity("trigger1", "group1")// 指定该触发器关联的JobDetail对象,也就是上述定义的jobDetail方法所构建的任务细节对象.forJob(jobDetail())// 使用CronScheduleBuilder按照给定的cron表达式来构建任务的执行计划,确定任务何时执行.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();}
}

3.编写定时任务逻辑

在job文件夹下创建一个MyJob.java来定义要实现的任务。

package com.cczj.job;import org.quartz.*;// 该注解表示在任务执行完成后,对任务执行过程中修改的JobDataMap数据进行持久化保存,
// 以便下次任务执行时可以获取到更新后的数据,常用于需要在多次任务执行间传递和累积数据的场景
@PersistJobDataAfterExecution
public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// 获取与当前正在执行的任务相关联的JobDetail对象,JobDetail包含了任务的详细信息,// 例如任务的标识、描述以及通过JobDataMap存储的可在任务执行期间使用的数据等JobDetail jobDetail = jobExecutionContext.getJobDetail();// 以下几行代码用于打印出任务相关的一些基本信息,方便查看任务执行情况以及进行调试等操作// 打印任务的名称,通过JobDetail的键(Key)获取其名称部分,能清晰知道正在执行的是哪个具体任务System.out.println("任务名称:" + jobDetail.getKey().getName() );// 打印任务所属的组名,同样通过JobDetail的键获取组名信息,组名常用于对多个相关任务进行分类管理System.out.println("任务组名:" + jobDetail.getKey().getGroup() );// 打印任务对应的类名,即当前实现了Job接口的这个类的全限定名,有助于确认任务执行的具体实现类System.out.println("任务类名:" + jobDetail.getClass().getName());// 打印本次任务的执行时间,通过JobExecutionContext获取任务被触发执行的时间信息System.out.println("执行时间:" + jobExecutionContext.getFireTime());// 打印任务上次的执行时间,如果是首次执行则该值可能为null,用于跟踪任务执行的历史时间序列System.out.println("上次执行时间:" + jobExecutionContext.getPreviousFireTime());// 打印任务下次预计的执行时间,方便了解任务后续的执行计划安排System.out.println("下次执行时间:" + jobExecutionContext.getNextFireTime());// 用于记录任务执行的次数,通过获取JobDetail中的JobDataMap,它是一个可以存储键值对的数据结构,// 在这里用于在多次任务执行过程中传递数据,比如此处存放任务执行次数相关的数据JobDataMap jobDataMap = jobDetail.getJobDataMap();// 从JobDataMap中获取名为"jobCount"的键对应的值,由于从JobDataMap中获取的值类型为Object,// 所以需要进行类型转换,这里假设存储的是Integer类型的任务执行次数数据Integer count = (Integer) jobDataMap.get("jobCount");System.out.println("任务执行次数:" + count);// 更新任务执行次数,每次任务执行成功后,执行次数加1// 这个更新后的数据会在下次任务执行时依然可用,实现了任务执行次数在多次执行间的累积统计功能jobDataMap.put("jobCount", ++count);}
}

运行后,可以看到控制台打印了MyJob里定义的逻辑

更多关于Quartz的使用,请参考文档 Quartz官方文档_w3cschool

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com