任务定时调度在企业级开发中的研究
2015-04-25孙忠林
王 秀,孙忠林,姜 莉
(山东科技大学 信息科学与工程学院,山东 青岛266590)
在企业级应用开发中,为了提高系统的效率,需要进行基于给定时间点,给定时间间隔或者给定执行次数的任务。随着业务流程复杂性的提升,自动化流程的益处显现更加明显,如企业网站非法用户解锁功能,需要实现每30 min对非法IP解锁的需求,这些任务无需人机交互,只需在系统后台运行。任务调度能较好满足企业应用的需求,更好地实现自动化。在Java的应用开发有多种多样的方法提供定时任务调度。
本文从实现原理和程序设计的角度分析3种任务调度的方式,包括使用JDK Timer,使用基于ScheduledExecuter接口的实现和使用Quartz调度器,满足复杂多样的任务定时调度。JDK Timer适用于特定时间点执行或以固定周期运行的任务,ScheduledExecuter可并发的完成定时任务,而Quartz可根据调度策略执行复杂的调度需求[1]。
1 使用JDK Timer调度任务
1.1 JDK Timer的原理
实现Timer的核心是Tasklist和TaskThread,Timer将接收到的任务存放在TimerList中,TimerList按照Task的最初执行时间进行排序。TimerThread在创建Timer时会启动成为一个守护线程。这个线程会轮询所有任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread被唤醒并执行该任务,之后TimerThread循环更新最近一个要执行的任务,继续休眠。
1.2 使用JDK Timer实现任务调度
创建一个TimerTask的继承类,实现自身的run方法,然后将其交给Timer去执行。
public class MyTask extends TimerTask{
Public void run(){…}}
Timer time=new Timer();
MyTask task=new MyTask();
time.schedule(task,0,2000)//每隔2 s执行一次
Timer的优点在于简单易用,但Timer对任务的调度基于绝对时间且是单线程执行,因此同一时刻只能执行一个任务。……
