Spring Boot整合Quartz 实现复杂的定时任务,
ccwgpt 2024-09-18 12:26 31 浏览 0 评论
在项目开发中,经常需要定时任务来后台处理业务,比如定时生成数据报表、生成对账单、数据监控等。Spring Boot 中有两种方案可以选择,第一种是 Spring Boot 内置的注解方式实现,这个方式之前介绍过了,可以看我这篇文章《Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务》,如果需要更复杂的应用场景那么就需要Quartz 实现, Quartz是目前最完善的定时任务框架。接下来一起学习Spring Boot如何整合Quartz 实现定时任务。
一、 Quartz 介绍
Quartz 是非常流行的开源任务调度管理,它是由 Java 开发,具有使用灵活、配置简单的特点。能够实现复杂的应用场景下的任务调度管理。
Quartz 中,有几个非常重要的概念: Job(任务)、 JobDetail(任务信息)、 Trigger(触发器)和Scheduler(调度器),只有熟悉这几个概念,才能明白 Quartz 怎么用。
(1) Job:是个接口,只有一个 execute方法,在实现接口的execute 方法中编写所需要定时执行的 功能;Job 运行时的信息保存在 JobDataMap 实例中。
(2) JobDetail: Quartz 每次调度 Job 时,都创建一个 Job 实例。它主要记录 Job 任务的相关基本信息(如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 对应的Job任务。
(3) Trigger:是一个触发类,描述触发 Job 执行的触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个类。SimpleTrigger 主要用于任务以固定时间间隔周期执行,而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案,如:设置任务每周一到周五的 15: 00~ 16: 00 执行等。
(4) Scheduler:就相当于一个独立运行容器,装载着任务和触发器 , 可以将 Trigger 和 JobDetail 注册到 Scheduler 中, Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。
四者其关系如下图所示:
二、整合Quartz
Spring Boot 2.0 提供了 spring-boot-starter-quartz 组件,它集成 Quartz 框架,让我们在项目中使用 Quartz 变得非常简单。
1、配置 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
Spring Boot 整合 quartz 非常简单,只需在pom.xml 文件中增加 quartz 依赖即可,无需其他配置。
三、创建简单任务
1、首先定义一个 Job 需要继承 QuartzJobBean,示例中 Job 定义一个变量 Name,用于在定时执行的时候传入。
public class SampleJob extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println(String.format("Hello %s!", this.name));
}
}
2、然后构建 JobDetail,并且构建时传入 name 属性的值,构建 JobTrigger 和 scheduleBuilder,最后使用Scheduler 启动定时任务。
@Configuration
public class SampleScheduler {
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")
.usingJobData("name", "World").storeDurably().build();
}
@Bean
public Trigger sampleJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever();
return TriggerBuilder.newTrigger().forJob(sampleJobDetail())
.withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();
}
}
启动项目后每隔两秒输出:
Hello World!
Hello World!
Hello World!
. . .
JobBuilder 构构造函数,只能通过 JobBuilder 的静态方法 newJob() 生成成 JobBuilder 实例。
withIdentity 方法可以传入两个参数 withIdentity(String name,String group) 来定义 TriggerKey,也可以不设置,像上一示例中会自动生成一个独一无二的 TriggerKey 来区分不同的 Trigger。
以上是创建简单的任务,任务以固定时间间隔周期执行。
四、创建cron定时任务
CronSchedule 可以设置更灵活的使用方式,定时设置可以参考上面的 cron 表达式。
1、首先定义两个 Job
public class ScheduledJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException{
System.out.println("schedule job1 is running ...");
}
}
2、构建 jobDetail、 CronTrigger,最后使用 scheduler 关联 jobDetail 和CronTrigger。 scheduleJob1 设置每间隔 6 秒执行一次。
private void scheduleJob1(Scheduler scheduler) throws SchedulerException{
JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class) .withIdentity("job1", "group1").build();
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail,cronTrigger);
}
CronScheduleBuilder.cronSchedule("0/6 * * * * ?"),按照 cron 表达式设置定时任务的执行周期。
3、触发定时任务
public void scheduleJobs() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduleJob1(scheduler);
scheduleJob2(scheduler);
}
最后
以上,就把Spring Boot集成Quartz,实现定时任务。还是比较简单的。还有一个比较重要的点是cron 表达式。这个后面会单独介绍。
这个系列课程的完整源码,也会提供给大家。大家私信我(章为忠学架构)。获取这个系列课程的完整源码。
推荐阅读:
Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务
Spring Boot入门系列(十五)Spring Boot 开发环境热部署的配置
Spring Boot 使用JdbcTemplate操作数据库,配置多数据源
相关推荐
- 质量持续改善流程,34页产品研发质量管理流程框架及详细方案
-
分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!产品研发质量管理流程框架及详细方案如何拿到分享的源文件:请您关注、转发,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给...
- [汇川PLC] 汇川IFA程序框架01-新建一个项目
-
汇川iFA对标西门子,新选择!汇川刚刚发布的iFA平台(2月14日),一眼望去就是对标西门子的全集成自动化平台博途(TIAPortal)。这个平台可以在一个平台上对PLC、变频器、伺服、工业机器人、...
- IBM EPF企业过程框架(ibm erp)
-
前言本人野路子出身,在过往的经历中都是自己摸索着学习,并没有建立体系化的能力框架,也因此往往过多关注具体的技术细节,缺乏体系化方法论支撑。之前也曾尝试去学习“金字塔原理”、“平衡计分卡模型”、“TOG...
- 嵌入式MCU程序框架设计:三种经典模式,你该选哪种?
-
在嵌入式开发中,程序框架设计是决定系统性能、可维护性和开发效率的关键。今天,我们将介绍三种经典的嵌入式MCU程序框架设计模式:顺序执行的前后台系统、时间片轮询系统和多任务操作系统(RTOS)。每种模式...
- 资深工程师分享:PLC程序设计思路分享(二)
-
在论坛里面有个学员问了一个程序设计的问题,问题如下所示:我现在有个程序没有想到办法,就是有五个气缸!每次随机选择,按先选先动的顺序编程!应该怎么做!能不能写个程序看看?s7-1200的plc.。例如选...
- 135页企业流程框架——美的战略经营部咨询方法论(可提供PDF)
-
如果觉得本文不错,欢迎大家转发、点赞和评论,您的鼓励是我持续更新的不竭动力!如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“俊知道”3个字,按照操作流程,专人负责发送源文件给您。...
- 单片机最好用的程序框架,莫过于状态机了
-
ZorbFramework是一个基于面向对象的思想来搭建一个轻量级的嵌入式框架。本次分享的是ZorbFramework的状态机的实现。中小型嵌入式程序说白了就是由各种状态机组成,因此掌握了如何构建...
- 52页流程信息化总体规划项目,制造与供应链高阶流程框架L1-L4
-
分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!流程信息化总体规划项目如何拿到分享的源文件:请您关注、转发,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...
- 【推荐】AI大模型研究框架|附下载
-
锋行链盟推荐阅读非会员仅试读以上内容公众号:锋行链盟后台回复【9033】下载报告回复【5】领取人工智能大模型报告合集|3200份...
- 四川石窟寺“1+4”保护研究框架协议签订
-
来源:环球网【环球网文化综合报道】近日,巴中石窟保护利用项目专家论证会召开。四川石窟寺保护研究院、乐山大佛石窟研究院、安岳石窟研究院、广元石窟研究所、巴中石窟研究中心四方共同签订了《四川石窟寺“1+...
- 如何使用知识框架进行学习和发展 | 2023年7月15日
-
今天想聊一聊知识框架这回事。在《费曼学习法》一书中看到了这样一个小故事:"从中学开始,小唐就拥有自己的学习小组,每个学习小组都代表了不同的兴趣和方向。他与不同的老师和同学在小组中做针对性的讨论...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- java框架spring (43)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)