SpringBoot集成Quartz(定时任务)
SpringBoot集成 任务 定时 quartz
2023-06-13 09:17:01 时间
quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,是由java开发的一个开源的任务日程管理系统。
quartz能做什么?
- 作业调度:调用各种框架的作业脚本,例如shell,hive等。
- 定时任务:在某一预定的时刻,执行你想要执行的任务。
架构图如下:
quartz包含的主要接口如下:
- Scheduler 代表调度容器,一个调度容器中可以注册多个JobDetail和Trigger。
- Job 代表工作,即要执行的具体内容。
- JobDetail 代表具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容。
- JobBuilder 用于定义或构建JobDetail实例。
- Trigger 代表调度触发器,决定什么时候去调。
- TriggerBuilder 用于定义或构建触发器。
- JobStore 用于存储作业和任务调度期间的状态。
以springboot集成quartz为例
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
创建真正的定时任务执行类,该类继承QuartzJobBean。
public class QuartzTestJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
String userName = (String) context.getJobDetail().getJobDataMap().get("userName");
System.out.println("userName:" + userName);
}
}
创建调度程序JobDetail和调度器Trigger。
@Configuration
public class QuartzConfig {
@Value("${sue.spring.quartz.cron}")
private String testCron;
/**
* 创建定时任务
*/
@Bean
public JobDetail quartzTestDetail() {
JobDetail jobDetail = JobBuilder.newJob(QuartzTestJob.class)
.withIdentity("quartzTestDetail", "QUARTZ_TEST")
.usingJobData("userName", "susan")
.storeDurably()
.build();
return jobDetail;
}
/**
* 创建触发器
*/
@Bean
public Trigger quartzTestJobTrigger() {
//每隔5秒执行一次
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(testCron);
//创建触发器
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(quartzTestDetail())
.withIdentity("quartzTestJobTrigger", "QUARTZ_TEST_JOB_TRIGGER")
.withSchedule(cronScheduleBuilder)
.build();
return trigger;
}
}
在yml文件中配置参数:
server:
port: 8081
sue:
spring:
quartz:
cron: "*/5 * * * * ?"
这样就能每隔5秒执行一次QuartzTestJob类的executeInternal方法了。
CronTrigger配置格式:
[秒] [分] [小时] [日] [月] [周] [年]
spring quartz跟spring task的cron表达式规则基本一致,只是spring4以上的版本去掉了后面的年,而quartz的CronTrigger的年是非必填的。
使用spring quartz的优缺点:
- 优点:默认是多线程异步执行,单个任务时,在上一个调度未完成时,下一个调度时间到时,会另起一个线程开始新的调度,多个任务之间互不影响。支持复杂的cron表达式,它能被集群实例化,支持分布式部署。
- 缺点:相对于spring task实现定时任务成本更高,需要手动配置QuartzJobBean、JobDetail和Trigger等。需要引入了第三方的quartz包,有一定的学习成本。不支持并行调度,不支持失败处理策略和动态分片的策略等。
多任务的问题,多个JobDetail使用同一个Trigger报错:Trigger does not reference given job:一个Job可以对应多个Trigger,但多个Job绑定一个Trigger报错
相关文章
- Springboot源码_pe启动制作源码
- SpringBoot的启动流程_springboot启动卡住了
- Spring学习笔记(二十六)——springboot集成elasticsearch
- Spring学习笔记(二十七)——springboot集成MyBatis-Plus学习总结
- springboot集成CAS单点登录客户端
- Flowable 快速入门教程:SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(超详细)[通俗易懂]
- 解决springboot 2.0集成elasticsearch 7.6.2 查询总数为10000
- springboot依赖springframework版本关系
- SpringBoot连接MySQL数据库操作
- 【SpringBoot】46、SpringBoot中整合JWT实现Token验证(拦截器篇)
- SpringBoot同一个服务多个端口启动
- springboot到底是什么_Springboot注解
- springboot 整合mybatis 注解方式_clickhouse partition by
- SpringBoot 简单集成 Swagger 方法
- 在springboot工程中修改使用quartz创建的定时任务
- SpringBoot集成Swagger
- SpringBoot整合达梦数据库
- springboot集成过滤器
- SpringBoot获取配置项原内容
- 3-1. SpringBoot项目集成【用户身份认证】实战 【技术选型篇】基于Session、Token、JWT怎么选?
- 3-2. SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token
- 3-3. SpringBoot项目集成【用户身份认证】实战 【全流程篇】基于JWT+双重检查的登录+登出+拦截器
- 阿里出品!SpringBoot应用自动化部署神器,IDEA版Jenkins?
- SpringBoot集成Swagger2详解编程语言
- SpringBoot整合easyexcel实现Excel的导入与导出详解编程语言
- SpringBoot集成Redis及使用总结详解编程语言