【读码练习/cron4j】(一)简述Scheduler。
crontable 是*nix下面的一个定时处理的服务。(最小精度是分钟)
一般如下配置:
* * * * * cmd
前面五个*号按顺序分别代表 分钟 小时 日 月 星期。
CRON4J
cron4j是在java下实现类似的功能一个开源框架.主要的类如下。
Scheduler 用来描述整个的调度过程。
Task 用来描述一个命令(cmd)。
SchedulingPattern 用来描述时间样式(* * * * *)。
TaskTable 用来描述一组Pattern/Task配置。
TaskCollector 一个接口,用来分离数据集合(MemoryTaskCollector、FileTaskCollector)和它的表现形式(TaskTable)
TaskExecutor 用来描述一个Task的执行和操作和组织一个Task执行所需的上下文。
SchedulerListener 一个接口,描述TaskExecutor执行的三个时机 Task的执行、执行完成、执行失败。
TaskExecutorListener 一个接口,描述TaskExecutor操作的几个时机。暂停、恢复、停止、中断、状态改变、完成数改变。
LauncherThread 一个Thread的子类。负责检查并执行一组给定的TaskCollector
Scheduler简述
主要的域(field)
daemon 一个Boolean 控制生成的线程是否是守护线程。
started 一个Boolean 表示Scheduler实例的运行状态。
collectors 一个Arraylist 包含Scheduler实例所有的TaskCollector。
memoryTaskCollector 一个TaskCollector的子类。负责管理来自内存的SchedulingPattern/Task
fileTaskCollector 一个TaskCollector的子类。负责管理来自文件的SchedulingPattern/Task
listeners 一个ArrayList。包含所有的SchedulerListener。
launchers 一个ArrayList。包含所有正在运行的LauncherThread。
executors 一个ArrayList。包含所有正在运行的TaskExecutor。
timer 一个线程。每分钟运行检查一次所有的TaskCollector是否可执行。
以一个最简单的Demo解释下运行流程
1 public static void main(String[] args) {
2 // Prepares the task.
3 MyTask task = new MyTask();
4 // Creates the scheduler.
5 Scheduler scheduler = new Scheduler();
6 // Schedules the task, once every minute.
7 scheduler.schedule("* * * * *", task);
8 // Starts the scheduler.
9 scheduler.start();
10 // Stays alive for five minutes.
11 try {
12 Thread.sleep(5L * 60L * 1000L);
13 } catch (InterruptedException e) {
14 ;
15 }
16 // Stops the scheduler.
17 scheduler.stop();
18 }
第五行, 实例化一个Scheduler会把初始化好的memoryTaskCollector和fileTaskCollector放入collectors。
以便通过collectors管理所有的SchedulingPattern/Task
第六行,把一个SchedulingPattern/Task加到memoryTaskColletor。
相对的还是ScheduleFile(File) 方法
第七行,启动scheduler实例
启动的过程里会初始化executors和launchers(两个管理容器)。并且启动timer。
timer随后每分钟执行一次检查。从collectors里取出所有的内容交付给一个LauncherThread的实例去处理。
LancherThread的实例会根据一个时间戳去比较取出来的ScheduringPattern。匹配的就执行Task。
为了更好的控制Task的执行。它会被包装在一个TaskExcutor里。(使之在运行前、运行完毕、运行失败、暂停、恢复、停止等等时机点有更大的扩展空间)
第十七行,结束scheduler实例
在运行的时候,每一个运行中的lanchuerThread和taskExecutor分别会被加入到launchers和executors。
所以关闭Scheduler的时候,不仅会中断timer。还会迭代launchers和executors里内容,确保它们也被中断。