Quartz实现定时任务

obsidiannn Lv3

Quartz

最近公司项目中用到了定时任务提醒的功能,Timer在功能上已经无法很好的满足业务,来学习一下Quartz

Quartz 的生命周期

  • Job接口

    在execute(JobExecation…){}中编写逻辑

  • 调用器

    执行Job时创建的Job实例,调用完成时,job实例会被释放并回收

JobDetail

属性

name          任务名称
group         任务组 默认DEFAULT
jobclass      
jobDetailMap  作用是在execute中传递参数,一般为基本数据类型
......

JobDataMap&TriggerDataMap:
强力的map型参数,由quzrtz封装,同时实现了map接口

关于Quzrtz的Trigger

  • 作为Quartz的触发器来执行Job

Trigger的通用属性

  • Job Key: 获取JobDetail的key值
  • startTime: 触发器首次触发的时间
  • endTime: …停止时间

SimpleTrigger& CronTrigger

SimpleTrigger:

SimpleTrigge有点类似Java中Timer的一个变体,但是个人觉得在逻辑上比Timer要来的简便

CronTrigger:

CronTriggerQuartz的核心,是一种基于日历的作业调度器

重点:
cron表达式:用来配置CronTrigger实例

7个子表达式组成,描述了时间表的详细信息

格式:

[秒] [分] [小时] [日] [月] [年]
注意 []之间有空格符

事例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
.withIdentity("myJob").build();
CronTrigger trigger = (CronTrigger) TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("* * * * * ?"))
.build();
// 创建Scheduler实例
SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler scheduler = sfact.getScheduler();
scheduler.start();
System.out.println("scheduled time is :"
+ sf.format(scheduler.scheduleJob(jobDetail, trigger)));
//scheduler执行两秒后挂起
Thread.sleep(2000L);
//shutdown(true)表示等待所有正在执行的job执行完毕之后,再关闭scheduler
//shutdown(false)即shutdown()表示直接关闭scheduler
scheduler.shutdown(false);
System.out.println("scheduler is shut down? " + scheduler.isShutdown());

其中 CronScheduleBuilder.cronSchedule("* * * * * ?"))这句就是Cron表达式的用法

关于Cron表达式的字符含义:

字段 是否必填 允许值 允许的特殊字符
0-59 , - * /
0-59 , - * /
小时 0-23 , - * /
1-31 , - * ? / L W C
1-12或者JAN-DEC , - * /
1-7或者SUN-SAT ,- * ? / L C #
empty,1970-2099 , - * /
特殊字符 含义
, 表示或 的意思
- 至某事某刻,between的关系
* 表示每,
/ 表示每隔某时间段触发,比如分的写法:0/5 表示每隔5分钟触发,5/20代表每五分钟触发一次,25,45各触发一次
? 表示无所谓,不关注,无关紧要
# 的意思,如6#3每月第三周星期五触发,6代表周五
L 代表最后一 的意思
W 表示有效工作日(周一到周五), LW可连用,表示某月最后一个工作日

关于周的换算:1代表周日,6代表周五,以此类推类推

如:
0 15 10 ? * 6L 2016-2017: 2016-2017年每月最后一周的周五10点15分执行

年可以不填QAQ

###SchedulerFactory

用来工厂模式来创建Schedular

StdSchedulerFactory

利用.getScheduler();方法初始创建调度器,参数配置可以采用quartz。properties方法

比较

Timer

1.无法并发执行:Timer不怎么支持并发

2.因为Timer有且仅有一个后台执行的线程,若一旦爆出RunTimeException,则会停止所有的任务执行

瓶颈:

a) 对时效性要求较高的多任务并发作业,虽然支持多任务,但是毕竟是串行接口

b) 对复杂任务的调度不足,不支持定时任务

Quartz

1.精细控制流程

2.支持若干任务在上面执行

a)调度功能

b) 持久化机制,数据不会丢失

c) 分布&集群功能

  • Title: Quartz实现定时任务
  • Author: obsidiannn
  • Created at : 2017-07-07 16:52:09
  • Updated at : 2025-03-20 00:21:52
  • Link: https://blog.dadonggua.top/2017/07/07/04Quartz/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments