SpringBoot3整合Quartz实现定时任务的示例
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
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 # 配置线程池线程数为 5 jobStore: misfireThreshold: 60000 # 设置作业存储的错过触发阈值为 60000 毫秒(1分钟)
这里使用了内存存储方式(job-store-type: memory
),也可以根据需要配置数据库存储任务信息。
3.4 创建一个 Quartz 任务类
创建一个简单的 Quartz 任务类,需要实现 Job
接口,并重写 execute
方法:
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class SampleJob implements Job { private static final Logger logger = LoggerFactory.getLogger(SampleJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { logger.info("Executing Sample Job at: " + context.getFireTime()); } }
3.5 配置任务调度器
在 Spring Boot 3 中,可以通过 @Configuration
创建 Quartz 的调度器,并配置定时任务的触发器(Trigger)和任务详情(JobDetail)。
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class QuartzConfig { @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class) .withIdentity("sampleJob") .storeDurably() .build(); } @Bean public Trigger sampleJobTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) // 每 10 秒执行一次 .repeatForever(); return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withIdentity("sampleJobTrigger") .withSchedule(scheduleBuilder) .build(); } }
sampleJobDetail
方法定义了任务的基本信息,包括任务类和名称。sampleJobTrigger
方法定义了触发器的调度策略,这里设置为每 10 秒执行一次。
3.6 使用 Cron 表达式配置任务
除了简单的时间间隔,还可以通过 Cron 表达式实现更灵活的调度。以下示例展示如何使用 Cron 表达式配置任务触发器。
import org.quartz.CronScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; @Bean public Trigger cronJobTrigger() { return TriggerBuilder.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 秒执行一次效果:
每分钟执行一次效果:
5. 动态管理 Quartz 任务
可以在代码中动态地添加、暂停、恢复和删除任务。例如,以下是动态添加任务的示例:
package com.coderjia.boot318quartz; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author CoderJia * @create 2024/11/13 下午 09:25 * @Description **/ @Service public class QuartzService { private final Scheduler scheduler; @Autowired public QuartzService(Scheduler scheduler) { this.scheduler = scheduler; } public void scheduleJob(JobDetail jobDetail, Trigger trigger) { try { scheduler.scheduleJob(jobDetail, trigger); } catch (Exception e) { e.printStackTrace(); } } public void pauseJob(String jobName, String jobGroup) { try { JobKey jobKey = new JobKey(jobName, jobGroup); scheduler.pauseJob(jobKey); System.out.println("Job paused: " + jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } public void resumeJob(String jobName, String jobGroup) { try { JobKey jobKey = new JobKey(jobName, jobGroup); scheduler.resumeJob(jobKey); System.out.println("Job resumed: " + jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } public void deleteJob(String jobName, String jobGroup) { try { JobKey jobKey = new JobKey(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 表达式实现复杂的调度策略。
以上就是SpringBoot3整合Quartz实现定时任务的示例的详细内容,更多关于SpringBoot3 Quartz定时任务的资料请关注脚本之家其它相关文章!
相关文章
Spring+SpringMVC+MyBatis深入学习及搭建(二)之MyBatis原始Dao开发和mapper代理开发
这篇文章主要介绍了Spring+SpringMVC+MyBatis深入学习及搭建(二)之MyBatis原始Dao开发和mapper代理开发,需要的朋友可以参考下2017-05-05java servlet手机app访问接口(一)数据加密传输验证
这篇文章主要为大家详细介绍了java servlet手机app访问接口(一),数据加密传输验证,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-12-12java Hibernate save()与persist()区别
本文章来给各位同学介绍一下Hibernate save()与persist()区别,希望此文章能对各位同学对于Hibernate save()与persist()有所理解2016-01-01
最新评论