比较常用的是,Spring对Quartz的支持,可以非常容易地进行定时任务的调度。一般,具有两种方式实现定时调度:
一种是通过继承Spring的org.springframework.scheduling.quartz.QuartzJobBean来定义定时任务,这种情况下与Spring代码有一定耦合。下面,通过例子来说明:
实现一个定时任务类,代码如下所示:
上面的JobExecutionContext context是一个任务执行上下文,可以通过配置,将需要的数据传递给executeInternal方法,然后在该方法中定义任务的处理逻辑。
这里,假设有一个类包含了对定时任务的控制信息,实现类为JobControlInfo,形式化定义如下所示:
通过Spring配置传递给JobExecutionContext context。
Spring配置文件quartz.xml的内容,如下所示:
下面可以启动定时任务了,代码如下所示:
我们定义这个定时任务,执行时间间隔为2s。
另一种是完全与Spring代码解耦合,而只是通过Spring配置就能进行定时任务的配置,一个定时任务可以是任意的Java处理类。而对于定时的配置,是基于Unix系统的crontab命令来实现的,更加灵活地配置定时任务。
下面说明实现方法:
定义一个普通的Java类,里面的一个方法里面包含了定时任务的处理逻辑,如下所示:
然后看下Spring配置文件quartz.xml内容:
通过Spring的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean来设置目标定时任务处理内容,如处理类和处理方法,通过org.springframework.scheduling.quartz.CronTriggerBean的cronExpression属性来配置定时任务,非常灵活。
上述配置,定时任务会自动调用MyQuartzJob类的scan方法来执行任务。
对于cronExpression属性的值,包括以下7 个字段:
有关各个字段可以设置的值,我们引用http://www.ibm.com/developerworks/cn/java/j-quartz/index.html的内容:
更多信息可以查阅相关资料。
启动定时任务,测试代码如下所示: