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的实例去处理。

根据一个时间戳去比较取出来的ScheduringPattern。匹配的就执行Task。

控制Task的执行。它会被包装在一个TaskExcutor里。(使之在运行前、运行完毕、运行失败、暂停、恢复、停止等等时机点有更大的扩展空间)


第十七行,结束scheduler实例

  在运行的时候,每一个运行中的lanchuerThread和taskExecutor分别会被加入到launchers和executors。

还会迭代launchers和executors里内容,确保它们也被中断。