任务调度和异步执行
目录
一、任务调度概述
1. 应用常见的任务调度,比如以时间为关注点的调度
- 隔半小时生成精华文章
- 凌晨统计用户排名
- 每30分钟针对锁定到期的用户进行解锁
- 每月1日凌晨统计上个月的数据,生成报表
- 每半小时查询用户是否有快到期的处理业务等
以及以资源为关注点的调度,比如:web server处理线程请求时,使用线程池共享服务的线程资源。
2. 任务调度本身涉及多线程并发、运行时间规则制定及解析、运行现场保持与恢复、线程池维度等多方面的工作。
二、任务调度Quartz
2.1 Quartz基础结构
主要有调度器、任务和触发器三个概念。
【1】Job接口
-
- 是一个接口,通过实现该接口来定义执行任务
- 只有一个方法void execute(JobExecutionContext context)
- Job运行时信息保存在JobDataMap实例中
- 有一个StatefulJob子接口,表示有状态的任务,不能并发执行。无状态的可并发
【2】JobDetail类
-
- 用来描述Job实现类机器静态信息,如名称、描述、关联监听器等
- 执行Job时,接收Job实现类,然后通过反射机制的newInstance来实例化job
- 构造函数:JobDetail(String name, String group, jobClass),name和group指在scheduler中的组名和名称
【3】Trigger类
-
- 是一个类,描述job的时间触发规则,有两个子类:
- SimpleTrigger:只触发一次或者固定间隔周期触发时使用
- CronTrigger:可通过cron表达式来进行复杂调度
【4】Calendar
-
- 是日历特定时间点的集合,如每年AnnualCalendar、每月MonthlyCalendar、每周WeeklyCalendar等
- 一个Trigger可以跟多个Calendar关联
- 举个栗子,如安排周一早晨9点执行任务,但遇到法定节假日则不执行,这时需要使用Calendar进行定点排除
【5】Scheduler
-
- 代表一个Quartz的独立运行容器
- Trigger和JobDetail可以注册到Scheduler中,拥有各自的组和名称
- Scheduler可将Trigger绑定到JobDetail中,这样Trigger被触发时,job会执行
- job和Trigger是1对多的瓜系,Scheduler和前两者是1对多的瓜系
- 可通过SchedulerFactory来创建Scheduler,有个SchedulerContext,通过Map保存上下文数据
【6】ThreadPool
-
- Scheduler使用线程池作为任务运行的基础设施
Quartz有完善的事件和监听体系。包括:
- 任务执行前/后事件
- 触发器触发前/后事件
- 调度器开始/关闭事件等
2.2 使用SimpleTrigger
2.3 使用CronTrigger
2.4 使用Calendar
2.5 任务调度信息存储
1. 通过配置文件调整保存策略
Quartz的属性配置文件包括三方面:
- 集群信息
- 调度器线程池
- 任务调度线程数据的保存