Spring Boot如何整合Quartz 实现定时任务
ccwgpt 2024-09-18 12:26 26 浏览 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操作数据库,配置多数据源
相关推荐
- 团队管理“布阵术”:3招让你的团队战斗力爆表!
-
为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...
- 知情人士回应字节大模型团队架构调整
-
【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...
- 豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍
-
强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...
- 创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)
-
创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...
- 消息称吴永辉入职后引发字节大模型团队架构大调整
-
2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...
- 31页组织效能提升模型,经营管理团队搭建框架与权责定位
-
分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...
- 异形柱结构(异形柱结构技术规程)
-
下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...
- 职场干货:金字塔原理(金字塔原理实战篇)
-
金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...
- 底部剪力法(底部剪力法的基本原理)
-
某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...
- 结构等效重力荷载代表值(等效重力荷载系数)
-
某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...
- 体系结构已成昭告后世善莫大焉(体系构架是什么意思)
-
实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...
- 框架柱抗震构造要求(框架柱抗震设计)
-
某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...
- 梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)
-
某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...
- 死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?
-
活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...
- 不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么
-
最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)