分布式调度框架Quartz衍生出的三种任务类型,你用过几个?
前言
Quartz
内部没有明确的任务类型的概念,在ApiBoot
中对其进行封装后才确切的定义了这个概念,可以根据业务场景按需选择适合的任务类型来构建执行的任务。
系列文章
ApiBoot Quartz
是以系列文章的形式更新,了解更多使用方法请访问如下链接:
ApiBoot
内其他组件系列使用文章请访问:ApiBoot开源框架各个组件的系列使用文章汇总
衍生的任务类型
ApiBoot
对Quartz
集成封装后,提供了如下三种的任务类型:
- OnceJob:一次性任务,仅执行一次
- CronJob:使用Cron表达式定义任务周期
- LoopJob:指定循环次数的任务
注意事项:任务类型是任务的执行方式类型,并不是创建任务的类型,创建任务都是通过继承
QuartzJobBean
来完成,同一个任务可以使用不同的类型执行。
演示项目
我们使用Idea
创建一个SpringBoot
项目,用于我们本章的演示项目,创建项目后添加ApiBoot Quartz
相关的依赖到pom.xml
文件内,如下所示:
1 | <dependencies> |
示例任务
我们来创建一个本章演示所需要的任务类,如下所示:
1 | /** |
当任务执行时就会在控制台输出任务执行的时间,继承自Spring
提供的封装任务类QuartzJobBean
,会自动扫描到DemoJob
并通过反射创建实例后放入Ioc
容器,具体的流程可以访问 这种方式整合Quartz你见过吗? 了解详情。
一次性任务
我们使用Once
任务类型来执行上面创建的DemoJob
示例任务,先上代码,如下所示:
1 | /** |
我们只需要一行代码就可以来定义一个新的任务,在代码中出现了一个新面孔 ApiBootOnceJobWrapper。
ApiBootOnceJobWrapper
主要工作是来封装Once类型任务所需要的配置字段,内部通过Lombok
提供的@Builder
注解来实现,Once
任务可配置的内容如下所示:
方法 | 默认值 | 描述 |
---|---|---|
.jobClass(Class<? extends QuartzJobBean> jobClass) | - | 配置所执行的QuartzJobBean实现类类型 |
.jobKey(String jobKey) | 随机UUID字符串 | 任务唯一key |
.startAtTime(Date startAtTime) | 当前时间 | 任务开始执行时间 |
.param(ApiBootJobParamWrapper param) | - | 任务执行时的参数列表封装对象 |
Cron表达式任务
Cron
表达式来创建任务是比较灵活的,也是比较常用的方式,使用ApiBoot Quartz
同样仅仅需要一行代码就可以实现,下面我们来定义每间隔一秒执行一次DemoJob
内的任务逻辑,如下所示:
1 | /** |
ApiBootCronJobWrapper 所做的工作与ApiBootOnceJobWrapper
其实是一样的,都是用来采集Cron
类型的任务所需要的配置字段,内部同样是通过Lombok
提供的@Builder
注解实现,Cron
类型任务可配置的内容如下所示:
方法 | 默认值 | 描述 |
---|---|---|
.jobClass(Class<? extends QuartzJobBean> jobClass) | - | 配置所执行的QuartzJobBean实现类类型 |
.jobKey(String jobKey) | 随机UUID字符串 | 任务唯一key |
.cron(String cron) | - | 任务执行时间的Cron表达式 |
.param(ApiBootJobParamWrapper param) | - | 任务执行时的参数列表封装对象 |
Loop循环任务
Loop
类型的任务在开发中也是比较常用的,根据指定的循环次数
以及每一次执行的间隔时间
运行定时任务逻辑,当获取到期望的结果后还可以将任务自身进行删除,先来看看一个简单例子:
1 | /** |
上面的定时任务会先执行1次后每
间隔2000毫秒
再执行5次,一共是执行6次,大家注意配置。
可以看到Loop
类型的任务也提供了一个 ApiBootLoopJobWrapper 来封装任务执行所需要的配置字段,可配置的字段方法如下所示:
方法 | 默认值 | 描述 |
---|---|---|
.jobClass(Class<? extends QuartzJobBean> jobClass) | - | 配置所执行的QuartzJobBean实现类类型 |
.jobKey(String jobKey) | 随机UUID字符串 | 任务唯一key |
.loopIntervalTime(int intervalTime) | 1000 | 循环执行的间隔时间,单位:毫秒 |
.repeatTimes(int times) | 0 | 循环执行次数 |
.startAtTime(Date startAtTime) | 当前时间 | 任务开始执行时间 |
.param(ApiBootJobParamWrapper param) | - | 任务执行时的参数列表封装对象 |
如果不设置
repeatTimes
仅执行一次,效果与Once
一样。
运行测试
在运行项目之前先来修改项目的XxxApplication
入口类,我们期望在项目启动完成后就执行任务,那么我们直接实现CommandLineRunner
接口来完成这一需求,如下所示:
1 | /** |
启动项目后我们可以在控制台看到有任务执行时间输出,如下所示:
1 | 2019-12-24 14:56:05.046 INFO 3113 --- [eduler_Worker-1] o.minbox.chapter.apiboot.quartz.DemoJob : 这是一个示例任务,执行时间:1577170565046 |
虽然任务已经执行了,但是由于是多种执行方式同时执行同一个任务,我们不好做出区分,针对这个问题可以使用
ApiBoot Quartz
提供的参数来解决。
敲黑板,划重点
ApiBoot Quartz
所提供的功能已经可以满足日常开发所需要,而且比较灵活,可以通过ApiBoot Quartz
提供的Wrapper
封装类的方法进行自定义配置,任务的执行是子线程异步操作,不需要考虑会影响访问响应的效率问题。
代码示例
如果您喜欢本篇文章请为源码仓库点个Star
,谢谢!!!
本篇文章示例源码可以通过以下途径获取,目录为apiboot-quartz-job-types
:
分布式调度框架Quartz衍生出的三种任务类型,你用过几个?