定时任务的需求在众多应用系统中普遍存在,在Spring中,咱们能够使用三种不一样的定时机制,下面一一描述并加以比较html
下面详细解释这个类图中涉及的关键类及其使用场景java
这是Spring中基于Quartz的定时机制入口,只要Spring容器装载了这个类,Quartz定时机制就会启动,并加载定义在这个类中的全部triggerlinux
Spring配置范例:程序员
实现了Trigger接口,基于Cron表达式的触发器spring
这种触发器的好处是表达式与linux下的crontab一致,可以知足很是复杂的定时需求,也容易配置express
Spring配置范例:服务器
该类也实现了Trigger接口,基于配置的定时调度并发
这个触发器的优势在于很容易配置一个简单的定时调度策略app
Spring配置范例:异步
JobDetail类的简单扩展,可以包装一个继承自QuartzJobBean的普通Bean,使之成为定时运行的Job
缺点是包装的Bean必须继承自一个指定的类,通用性不强,对普通Job的侵入性过强,不推荐使用
Spring提供的一个不错的JobDetail包装工具,可以包装任何bean,并执行类中指定的任何stati或非static的方法,避免强制要求bean去实现某接口或继承某基础类
Spring配置范例:
Quartz中提供了相似WebWork的拦截器的功能,系统执行任务前或任务执行完毕后,都会检查是否有对应的Listener须要被执行,这种AOP的思想为咱们带来了灵活的业务需求实现方式。
例如如今有一个简单的业务要求:任务执行前先判断当前服务器是否为task服务器,不是则不执行任务。对于这种业务需求,咱们能够简单的实现一个TriggerListener,并将其插入SchedulerFactoryBean的globalTriggerListeners中,这样全部的job在执行先后都会调用TriggerListener中对应的方法。
代码范例:
JDK提供了基础的定时类:Timer,在这个类的基础上,Spring提供了一套简单的定时机制
下面详细解释这个类图中涉及的关键类及其使用场景
这个类很是相似Quartz中的SchedulerFactoryBean,是基于Timer的定时机制的入口,Spring容器装载此类后会自动开始定时器
Spring配置范例:
相似于Quartz中的Trigger的SimpleTriggerBean实现,任务是在设定的时间触发并执行配置的任务,特色是配置简单、明了,使用于简单的任务触发逻辑
Spring配置范例:
普通task实现必需要继承的父类,主要包含一个run()的方法,相似Quartz中的QuartzJobBean,对应用侵入性较强,也不推荐使用
相似Quartz中的MethodInvokingJobDetailFactoryBean,用于封装任何bean,并能够执行bean中的任意方法,再也不复述
这种定时机制与上面两种定时机制没有太大区别,特别是在配置和实现功能上,不一样的是它的核心是基于ScheduledExecutorService(ScheduledThreadPoolExecutor是默认实现),一种JDK5.0中提供的基于线程的并发机制,
关于JDK5中的线程池的概念及其一些深刻分析,请参考老唐的博客:http://blog.csdn.net/sfdev/archive/2008/12/30/3648457.aspx 这里再也不复述
看完了这三种定时机制,各有各的优劣,不一样场景下咱们应该灵活选择不一样的定时机制。总的来讲,若是咱们须要简单的定时器,咱们能够选用基于timer的定时器,若是定时规则较为复杂,咱们能够选用基于Quartz的定时器,若是咱们要用到线程池来处理异步任务,咱们能够选用基于Executor的定时机制,虽然只是任务实现中用到线程池,毕竟也是一脉相承的,固然也能够用Quartz的定时器+基于Executor的任务线程池,彻底没有任何冲突的。
说这么多,仍是比较抽象,不如咱们来分析一下老唐的Notify系统来加深对Spring定时机制的了解(详细设计参考最近一期的程序员杂志)。
在老唐的Notify系统中,彻底使用了基于JDK5.0中的Executor的定时机制,即由一个ScheduledExecutorFactoryBean触发系统的每隔2分钟运行一个单线程的任务,在这个任务中,执行完各类机制检查和配置策略后,将要执行的Notify任务放入一个已配置好的线程池,并由线程池指定线程来完成Notify的任务。
在最近一期的项目中,咱们将task移植到了apps,Notify系统也同时被移植过来了,为了统一全部的task,咱们将之前task中基于timer、Quartz和Executor的各类任务统一改成基于Quartz的调度。在这个过程当中,Notify系统的基于Executor的定时机制也被改成基于Quartz的定时机制,过程很是顺利。基于此次移植项目,能够说这三种定时机制是很是容易互换的,而且通用性比较强,只须要简单的配置便可。