Spring Boot整合Quartz 实现复杂的定时任务,
ccwgpt 2024-09-18 12:26 33 浏览 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操作数据库,配置多数据源
相关推荐
- ai结合这3个开源架构图工具,画架构图不再纠结
-
工具介绍MermaidPlantUMLDiagramMermaid官网地址:Mermaid|Diagrammingandchartingtool只需要很简单的代码,就能够画出流程图、时序图、...
- 怎么用DeepSeek生成系统架构图?DS高级使用技巧分享!
-
系统架构图怎么画?熟悉系统架构图的人都知道,架构图是对现实系统的抽象归纳和概括,包含了多个层级和元素,譬如组件、连接、分层、边界、接口、协议和数据流等,而且层级元素间涉及逻辑关系,错综复杂,这对初次绘...
- 零基础3步画绝美国风美景!彩铅+马克笔就能画出诗意青绿山水
-
黛瓦连绵岁月悠,檐头一抹绿惊眸。不知何日化灵种,许是春风巧意留。沐雨经霜添秀色,凌虚向宇展清柔。此般青绿融残梦,静守时光意自幽。最近发现越来越多朋友开始尝试传统文化相关的手工创作,作为深耕绘画领域多年...
- 如何在PDF文档中绘制流程图?
-
教师在制作教学大纲时,如何绘制教学流程图以展示课程安排?高校行政人员,如何绘制流程图,来清晰地展示各项事务的办理流程?在实验课程中,如何绘制实验流程图,方便学生查看实验步骤和操作顺序?利用福昕高级PD...
- 儿童画教程|透视的魔法:教你画海底隧道
-
小朋友们,今天我们要学习一种特别的绘画技巧,它的名字叫“一点透视”。听起来是不是有点陌生?别担心,如果我举几个例子,你们一定会觉得特别熟悉!比如,当你站在一条笔直的马路上,远处的路看起来是不是越来越窄...
- 每天学习一个AI小技巧:如何用AI帮助我们绘制思维导图?
-
1.让DeepSeek生成某本书或其他内容的思维导图。例如,生成一张关于《控制习惯》的思维导图,内容尽可能详细,涉及到全书的所有核心内容。2.将DeepSeek生成思维导图的框架内容复制到ima...
- KIMI自动生成组织架构图,不要再傻傻的,一个一个的画了
-
今天跟大家分享下,我们如何使用KIMI来快速的制作组织架构图,相较于Deepseek,Kimi可以预览结果,还能直接下载架构图为图片,比Deepseek方便不少,每个AI工具都有自己的特点,大家不要死...
- 架构图怎么画?推荐7款专业的架构图绘制软件,支持AI画图
-
在绘制架构图这件事上,好用的工具能让我们事半功倍。今天就给大家介绍几款绘制架构图的工具,其中就不得不提到亿图图示。1、亿图图示亿图图示是一款功能强大的图形图表设计软件,非常适合用来绘制架构图。它提供了...
- 组织结构图的绘制方法
-
组织结构图是一种用于展示组织内部结构和层级关系的重要工具。它不仅能够帮助管理者清晰地了解各部门之间的关系,也能为员工提供明确的职责和汇报线。绘制一幅有效的组织结构图需要一定的方法和步骤。本文将详细介绍...
- 如何画一张架构图(内含知识图谱)
-
走过路过不要错过今日精彩话题,感谢大家的阅览,希望能获得您的点赞关注评论小编在此先祝大家天天开心,日进斗金!年年快乐!0102工作五年,我是做架构设计的,整天忙于画图开会,家里装修啥也不管,赚的...
- Google Play强制新规:应用必须适配16 KB页面大小
-
IT之家5月10日消息,科技媒体9to5Google昨日(5月9日)发布博文,报道称谷歌将于2025年11月1日开始,其GooglePlay应用商店将推行新规,针对...
- 谷歌拟将eSIM纳入Google One账号备份,Android换机有望更便捷
-
IT之家4月30日消息,现如今eSIM正逐渐引起用户关注,其相比实体SIM卡使用起来更为方便。但如果手机损坏,使用eSIM的用户往往难以自行恢复网络服务——因为eSIM无法...
- Google Play收款方式
-
GooglePlay是全球知名的应用商店,为开发者们提供了广阔的盈利空间。当开发者们在GooglePlay上发布的应用或游戏获得收入后,选择合适的收款方式能使收益最大化。下面将详细介绍Google...
- 谷歌推出Android跨设备共享功能,实现无缝切换与热点共享
-
来源:环球网【环球网科技综合报道】7月30日,据engadget等媒体消息,谷歌近日正式推出了其全新的跨设备共享功能,这一创新服务允许用户在手机、平板电脑和Chromebook之间即时共享热点,甚至...
- 要变天了?谷歌正式放弃安卓APK 采用AAB
-
近日外媒AndroidAuthority报道了一则重要消息,那就是谷歌正式宣布安卓APK被AAB取代,8月份开始所有在GooglePlay商店的应用,都需要采用AAB格式。据悉,AAB格式在201...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)