这里是修真院后端小课堂,每篇分享文从
八个方面深度解析后端知识/技能,本篇分享的是:
【Quartz】
【修真院Java小课堂】任务调度-Quartz
开场语:
大家好,我是IT修真院北京分院第32期的学员廖友,一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java任务十中的知识点——任务调度-Quartz
一、背景介绍:
1、任务调度概念
任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。
2、任务调度应用场景
场景一:聚划算 整点抢红包
场景二:双十一实时统计交易额
以上两种场景都可以通过定时任务来实现,分别是按按指定时间执行任务、固定频率执行任务两种。
3、任务调度的几种Java实现
Timer
ScheduledExecutor
Spring Scheduled
开源工具包 Quartz
开源工具包 JCronTab
二、知识剖析:
1、Quartz核心概念
任务Job:做什么工作
触发器Trigger:什么时候工作
调度器Scheduler:将Job和Trigger整合到一块创建一个作业计划,即什么时候做什么事
2、Quartz的几个核心接口
Job是一个接口,只有一个方法execute,定义作业时需要实现此接口的execute方法。
JobDetail:JobDetail是一个接口,通过JobDetail的实现类可以设置具体的执行job,并且可以给执行的job设置名称、分组以及参数。
Trigger:Trigger是一个接口,用以设置触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger两个实现类。SimpleTrigger适用于单次执行或固定周期计划任务执行。CronTrigger可以通过Cron表达式定义出各种复杂时间规则的调度计划。
Scheduler:Scheduler是一个接口,它提供了对作业计划的启动、停止、恢复、删除等操作,它通过JobDetail和Trigger创建一个作业计划。
3、cron表达式
由七个部分组成,从左到右依次为:秒 分 时 日 月 星期 年 。其中年可选,一般都用不上。
特殊符号:
星号(*):可用在所有字段中,表示对应时间域的每一个时刻,如在分钟时段,表示”每分钟“。可以理解为通配符,通配所有时间。
问号(?):只在日期和星期字段使用,它通常指定为”无意义的值“。
减号(-):表示一个范围,如在小时字段使用”10-12“,表示从10点到12点,即10 11 12。
逗号(,):表示一个列表值,如在小时字段使用”5,7,10“,表示5点,7点,10点。
(/):表示间隔时间
4、cron练习
“0 0 12 * * ?” 每天中午12点触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
在线生成cron表达式:http://cron.qqe2.com/
5、springboot整合Quartz
三、编码实战
四、参考文献:
[1]https://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/
[2]http://www.quartz-scheduler.org/
五、更多讨论:
Q1:任务调度的几种Java实现有什么区别?
A1:Timer是jdk最开始添加的任务调度器,但它只能单线程运行,即每个任务是串行的,一次只能执行一个任务,所以后来Java开发了ScheduledExecutor。Spring Scheduled是Spring自带的,使用方便,只需添加注解即可,对于简单的任务特别合适,而Quartz是一个专门的任务调度框架,适合复杂的任务调度和分布式调度。
Q2:在使用cron表达式时,若设置的时间不在字段范围会怎么样?
A2:在程序运行时会抛出异常并给出提示。
Q3:对于cron表达式,为什么推荐省去最后一位?
A3:首先最后一位表示年,这个在项目中不常用,其次在有些环境中,不支持七位的cron表达式,只支持六位的cron表达式。
六、结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~