0


重学SpringBoot3-整合Quartz定时任务

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

Quartz 是一个开源的任务调度框架,用于在应用程序中创建、管理和调度定时任务。将 Quartz 和 Spring Boot 3 结合,可以轻松实现定时任务的灵活管理。本文将详细介绍如何在 Spring Boot 3 项目中集成 Quartz Scheduler 并实现示例任务的调度。

1. 什么是 Quartz Scheduler?

Quartz 是 Java 平台下的一个强大、灵活的调度库,它支持复杂的任务调度,包括:

  • 简单的任务:按固定频率或延迟执行任务。
  • 基于 Cron 表达式的任务:支持类似于 Linux Cron 的表达式,用于定义复杂的定时任务。
  • 持久化任务:支持将任务数据持久化存储,以便在应用程序重启后可以恢复任务状态。

2. Spring Boot 3 集成 Quartz Scheduler 的优势

  • 无缝集成:通过 Spring Boot 3 的自动配置特性,无需编写复杂的配置即可使用 Quartz。
  • 灵活管理:支持任务的动态添加、暂停、恢复和删除。
  • 扩展性:可以轻松扩展任务调度系统,便于业务逻辑的复杂应用。

3. Spring Boot 3 集成 Quartz 的步骤

3.1 创建 Spring Boot 项目

可以使用 Spring Initializr 创建项目,选择以下依赖:

  • Spring Web
  • Quartz Scheduler

image-20241113205514778

3.2 添加 Quartz 依赖

如果使用的是手动创建的项目,可以在

pom.xml

中添加 Quartz 的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

3.3 配置 Quartz 属性

application.yml

application.properties

文件中配置 Quartz 的基本属性,例如任务存储和调度方式。

以下是

application.yml

配置示例:

spring:application:name: spring-boot3-19-quartz
  quartz:job-store-type: memory  # 储类型为内存存储properties:org:quartz:threadPool:threadCount:5# 配置线程池线程数为 5jobStore:misfireThreshold:60000# 设置作业存储的错过触发阈值为 60000 毫秒(1分钟)

这里使用了内存存储方式(

job-store-type: memory

),也可以根据需要配置数据库存储任务信息。

3.4 创建一个 Quartz 任务类

创建一个简单的 Quartz 任务类,需要实现

Job

接口,并重写

execute

方法:

importorg.quartz.Job;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;@ComponentpublicclassSampleJobimplementsJob{privatestaticfinalLogger logger =LoggerFactory.getLogger(SampleJob.class);@Overridepublicvoidexecute(JobExecutionContext context)throwsJobExecutionException{
        logger.info("Executing Sample Job at: "+ context.getFireTime());}}

3.5 配置任务调度器

在 Spring Boot 3 中,可以通过

@Configuration

创建 Quartz 的调度器,并配置定时任务的触发器(Trigger)和任务详情(JobDetail)。

importorg.quartz.JobBuilder;importorg.quartz.JobDetail;importorg.quartz.SimpleScheduleBuilder;importorg.quartz.Trigger;importorg.quartz.TriggerBuilder;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassQuartzConfig{@BeanpublicJobDetailsampleJobDetail(){returnJobBuilder.newJob(SampleJob.class).withIdentity("sampleJob").storeDurably().build();}@BeanpublicTriggersampleJobTrigger(){SimpleScheduleBuilder scheduleBuilder =SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10)// 每 10 秒执行一次.repeatForever();returnTriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("sampleJobTrigger").withSchedule(scheduleBuilder).build();}}
  • sampleJobDetail 方法定义了任务的基本信息,包括任务类和名称。
  • sampleJobTrigger 方法定义了触发器的调度策略,这里设置为每 10 秒执行一次。

3.6 使用 Cron 表达式配置任务

除了简单的时间间隔,还可以通过 Cron 表达式实现更灵活的调度。以下示例展示如何使用 Cron 表达式配置任务触发器。

importorg.quartz.CronScheduleBuilder;importorg.quartz.Trigger;importorg.quartz.TriggerBuilder;@BeanpublicTriggercronJobTrigger(){returnTriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("cronJobTrigger").withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *"))// 每分钟执行一次.build();}

在这个例子中,Cron 表达式

"0 0/1 * 1/1 * ? *"

表示每分钟执行一次任务。

4. 运行应用并查看日志

配置完成后,启动 Spring Boot 应用。Quartz Scheduler 会按照配置执行

SampleJob

任务。您可以在控制台中看到日志输出,类似如下:

2024-11-13T21:07:39.910+08:00  INFO 11984 --- [spring-boot3-18-quartz] [eduler_Worker-4] c.coderjia.boot318quartz.job.SampleJob   : Executing Sample Job at: Wed Nov 13 21:07:39 CST 2024

每 10 秒执行一次效果:

每 10 秒执行一次

每分钟执行一次效果:

每分钟执行一次

5. 动态管理 Quartz 任务

可以在代码中动态地添加、暂停、恢复和删除任务。例如,以下是动态添加任务的示例:

packagecom.coderjia.boot318quartz;importorg.quartz.JobDetail;importorg.quartz.JobKey;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.quartz.Trigger;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;/**
 * @author CoderJia
 * @create 2024/11/13 下午 09:25
 * @Description
 **/@ServicepublicclassQuartzService{privatefinalScheduler scheduler;@AutowiredpublicQuartzService(Scheduler scheduler){this.scheduler = scheduler;}publicvoidscheduleJob(JobDetail jobDetail,Trigger trigger){try{
            scheduler.scheduleJob(jobDetail, trigger);}catch(Exception e){
            e.printStackTrace();}}publicvoidpauseJob(String jobName,String jobGroup){try{JobKey jobKey =newJobKey(jobName, jobGroup);
            scheduler.pauseJob(jobKey);System.out.println("Job paused: "+ jobKey);}catch(SchedulerException e){
            e.printStackTrace();}}publicvoidresumeJob(String jobName,String jobGroup){try{JobKey jobKey =newJobKey(jobName, jobGroup);
            scheduler.resumeJob(jobKey);System.out.println("Job resumed: "+ jobKey);}catch(SchedulerException e){
            e.printStackTrace();}}publicvoiddeleteJob(String jobName,String jobGroup){try{JobKey jobKey =newJobKey(jobName, jobGroup);boolean deleted = scheduler.deleteJob(jobKey);if(deleted){System.out.println("Job deleted: "+ jobKey);}else{System.out.println("Job not found: "+ jobKey);}}catch(SchedulerException e){
            e.printStackTrace();}}}

调用

scheduleJob

方法可以动态地添加新的任务。类似地,使用

scheduler.pauseJob()

scheduler.deleteJob()

可以暂停或删除任务。

6. 总结

通过将 Quartz 与 Spring Boot 3 结合,我们可以实现强大而灵活的定时任务调度系统。本文介绍了 Quartz 的基本配置和使用方法,包括如何配置任务、触发器,以及使用 Cron 表达式实现复杂的调度策略。

标签: spring boot java Quartz

本文转载自: https://blog.csdn.net/u014390502/article/details/143753024
版权归原作者 CoderJia_ 所有, 如有侵权,请联系我们删除。

“重学SpringBoot3-整合Quartz定时任务”的评论:

还没有评论