关注微信技术公众号:CodingTechWork
,一起学习进步。
引言
一般在使用定时任务时,我们首先会想到使用@Scheduled
注解去给某个任务设置定时时间进行定时执行。当定时任务过多时,或者有增删改查需求时,@Scheduled
注解将无法满足我们的需求。本文一起学习总结Quartz定时框架
的使用。
Quartz介绍
概述
Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.
Quartz is freely usable, licensed under the Apache 2.0 license.
Quartz是OpenSymphony开源的一个项目,是一个由Java编写的开源作业调度框架。
特点
- 支持分布式高可用,我们需要某个定时任务在多个节点中只有某个节点可以执行时,就需要Quartz来实现,否则使用@Scheduled等方式会造成所有节点都执行一遍。
- 支持持久化,Quartz有专门的数据表来实现定时任务的持久化。
- 支持多任务调度和管理,Quartz可以在数据库中存储多个定时任务进行作业调度,可以实现定时任务的增删改查等管理。
组成
Quartz由三部分组成:
- 任务:JobDetail
- 触发器:Trigger(分为SimpleTrigger和CronTrigger)
- 调度器:Scheduler
JobDetail
JobDetail主要由JobKey(job的名字name和分组group)、JobClass、JobDataMap(任务相关的数据)、JobBuilder组成。常用的是前几个。
JobDetail源码
1 | java复制代码package org.quartz; |
JobDetail示例
1 | java复制代码 Map<String,String> jobData = new HashMap<>(); |
Trigger
Trigger规定触发执行Job实现类,主要有SimpleTrigger和CronTrigger两个实现类。Trigger由以下部分组成:
- TriggerKey(job的名字name和分组group)
- JobDataMap(Trigger相关的数据,同JobDetail中JobDataMap,存相同key,若value不同,会覆盖前者。)
- ScheduleBuilder(有CronScheduleBuilder、SimpleScheduleBuilder、CalendarIntervalScheduleBuilder、DailyTimeIntervalScheduleBuilder常用前2种。)
Trigger示例
1 | java复制代码 //SimpleScheduleBuilder |
Scheduler
调度器就是为了读取触发器Trigger从而触发定时任务JobDetail。可以通过SchedulerFactory进行创建调度器,分为StdSchedulerFactory(常用)和DirectSchedulerFactory
两种。
- StdSchedulerFactory使用一组属性(放在配置文件中)创建和初始化调度器,然后通过
getScheduler()
方法生成调度程序。 - DirectSchedulerFactory不常用,容易硬编码。
Scheduler示例
1 | java复制代码 //建好jobDetail,trigger |
Cron表达式
定时任务离不开Cron表达式设置具体执行时间或执行周期,Cron表达式是一个字符串,一般有两种表达:
秒 分 小时 日 月 星期 年
秒 分 小时 日 月 星期
其中,年份即为可选的,所以一般表达式为6-7个域,每个域以空格分开。其中的星期除了可以使用英文缩写,也可以用数字1-7数字
来表示,注意1
表示的是星期日
,7
表示的星期六
。
*
:星号,表示每个字段对应的时间域的每一个
,如在日中,就是表示每天。?
:问号,只能在日期和星期字段中使用,表示无意义的值
,等价于点位符。-
:减号,表示一个范围,如在分钟中使用5-8
,则表示5-8分钟
,即5、6、7、8分钟。,
:逗号,表示一个列表值,如在星期中星期一和星期三使用MON,WED
,也可以使用数字来表示:1,3
。/
:斜杠,使用x/y
来表示一个等步长序列,x表示起始值,y表示步长值。如在秒字段中使用0/15
,表示从0秒开始,每15秒增量,即0秒,15秒,30秒,45秒,这种就可以理解为每15秒
执行任务。L
:只能在日期和星期字段中使用,表示Last
。在日期中,L
表示月份的最后一天,如1月中的31日;在星期中,L
表示星期六(或数字7)。W
:只能在日期字段中使用,表示离该日期最近的工作期,不可以跨月。如10W
,表示离该月10号最近的工作日,若10号为星期六,则匹配9号星期五;若10号为星期日,则匹配11号星期一;若10号为星期一,则匹配10号星期一。LW
组合表示该月的最后一个工作日。C
:只能在日期和星期字段中使用,表示Calendar
,即计划所关联的日期,若日期未被关联,则等价于关联所有日期。如日期中使用4C
,表示日期4号以后的第一天;星期中使用1C
,表示星期日后的第一天。#
:井号只能在星期字段中使用,表示当月某个工作日。如6#2
表示当月的第二个星期五(其中,6
表示星期五,#3
表示当月的第二个).
Cron示例
Cron表达式 | 说明 |
---|---|
0 0 * * * ? | 每小时0分0秒运行 |
0 0 1 * * ? | 每天01:00:00运行运行 |
0 0 1 * * ? * | 每天01:00:00运行运行,同上 |
0 0 1 * * ? 2021 | 2021年每天01:00:00运行 |
0 * 10 * * ? | 每天10点-11点之间每分钟运行一次,开始于10:00:00,结束于10:59:00 |
0 0/5 10 * * ? | 每天10点-11点之间每5分钟运行一次,开始于10:00:00,结束于10:59:00 |
0 0/5 10,15 * * ? | 每天10点-11点之间每5分钟运行一次,每天15点-16点之间每5分钟运行一次 |
0 0-10 10 * * ? | 每天10:00-10:10之间每分钟运行 |
0 10 1 ? * MON-FRI | 每周一,二,三,四,五的1:10分运行 |
0 10 1 1 * ? | 每月1日的1:10分运行 |
0 10 1 L * ? | 每月最后一天1:10分运行 |
0 10 1 ? * 6L | 每月最后一个星期五1:10分运行 |
0 10 1 ? * 6#3 | 每月第3个星期五1:10分运行 |
Quartz增删改查模板
QuartzService接口类
1 | java复制代码package com.andya.selfcode.quartzservice; |
QuartzServiceImpl实现类
1 | java复制代码package com.andya.selfcode.quartz.service; |
Quartz使用方式
应用启动时自动调用
写一个配置类,使用@Bean注解
进行配置实例化。
QuartzConfig配置类
1 | java复制代码package com.andya.selfcode.quartz; |
SchedulerJob任务类增删
1 | java复制代码package com.andya.selfcode.quartz; |
具体Job任务类
ScheduleWithJob1类
1 | java复制代码package com.andya.selfcode.quartz; |
ScheduleWithJob2类
1 | java复制代码package com.andya.selfcode.quartz; |
ScheduleJobService接口类
1 | java复制代码package com.andya.selfcode.service; |
HTTP接口方式调用
写一个controller层直接调用QuartzService接口类。
1 | java复制代码package com.andya.selfcode.quartz.controller; |
Quartz数据表脚本
quartz初始化数据表的sql脚本如下。
1 | sql复制代码-- 1.1. qrtz_blob_triggers : 以Blob 类型存储的触发器。 |
refer by
www.quartz-scheduler.org/
本文转载自: 掘金