有两种流行Spring定时器配置Java的Timer类和OpenSymphony的Quartz
Java Timer定时
首先继承javautilTimerTask类实现run方法
import javautilTimerTask;
public class EmailReportTask extends TimerTask{
@Override
public void run() {
}
}
在Spring定义
配置Spring定时器
<bean id=scheduleReportTask class=orgspringframeworkschedulingtimerScheduledTimerTask>
<property name=timerTask ref=reportTimerTask />
<property name=period>
<value>value>
property>
bean>
timerTask属性告诉ScheduledTimerTask运行哪个代表个小时
启动Spring定时器
Spring的TimerFactoryBean负责启动定时任务
<bean class=orgspringframeworkschedulingtimerTimerFactoryBean>
<property name=scheduledTimerTasks>
<list><ref bean=scheduleReportTask/>list>
property>
bean>
scheduledTimerTasks里显示一个需要启动的定时器任务的列表
可以通过设置delay属性延迟启动
<bean id=scheduleReportTask class=orgspringframeworkschedulingtimerScheduledTimerTask>
<property name=timerTask ref=reportTimerTask />
<property name=period>
<value>value>
property>
<property name=delay>
<value>value>
property>
bean>
这个任务我们只能规定每隔小时运行一次无法精确到某时启动
Quartz定时器
首先继承QuartzJobBean类实现executeInternal方法
import orgquartzJobExecutionContext; import orgquartzJobExecutionException; import orgspringframeworkschedulingquartzQuartzJobBean;
public class EmailReportJob extends QuartzJobBean{
protected void executeInternal(JobExecutionContext arg)
throws JobExecutionException {
}
}
在Spring中定义
<bean id=reportJob class=orgspringframeworkschedulingquartzJobDetailBean>
<property name=jobClass>
<value>EmailReportJobvalue>
property>
<property name=jobDataAsMap>
<map>
<entry key=courseService>
<ref bean=courseService/>
entry>
map>
property>
bean>
在这里我们并没有直接声明一个EmailReportJob Bean而是声明了一个JobDetailBean这个是Quartz的特点JobDetailBean是Quartz的orgquartzJobDetail的子类它要求通过jobClass属性来设置一个Job对象
使用Quartz的JobDetail中的另一个特别之处是EmailReportJob的courseService属性是间接设置的JobDetail的jobDataAsMap属性接受一个Map包括设置给jobClass的各种属性当JobDetailBean实例化时它会将courseService Bean注入到EmailReportJob 的courseService 属性中
启动定时器
Quartz的orgquartzTrigger类描述了何时及以怎样的频度运行一个Quartz工作Spring提供了两个触发器SimpleTriggerBean和CronTriggerBean
SimpleTriggerBean与scheduledTimerTasks类似指定工作的执行频度模仿scheduledTimerTasks配置
<bean id=simpleReportTrigger class=orgspringframeworkschedulingquartzSimpleTriggerBean>
<property name=jobDetail ref=reprotJob />
<property name=startDelay>
<value>value>
property>
<property name=repeatInterval>
<value>value>
property>
bean>
startDelay也是延迟个小时启动
CronTriggerBean指定工作的准确运行时间
<bean id=cronReportTrigger class=orgspringframeworkschedulingquartzCronTriggerBean>
<property name=jobDetail ref=reprotJob />
<property name=cronExpression>
<value> * * ?value>
property>
bean>
属性cronExpression告诉何时触发最神秘就是cron表达式
Linux系统的计划任务通常有cron来承担一个cron表达式有至少个(也可能个)有空格分隔的时间元素从左到右
秒分小时月份中的日期()月份(或JANDEC)星期中的日期(或SUNSAT)年份()
每个元素都显示的规定一个值(如)一个区间()一个列表()或一个通配符(*)因为和这两个元素是互斥的因此应该通过设置一个问号(?)来表明不想设置的那个字段/如果值组合就表示重复次数(/表示每秒重复次)
启动定时器
<bean class=orgspringframeworkschedulingquartzSchedulerFactoryBean>
<property name=triggers>
<list><ref bean=cronReportTrigger/>list>
property>
bean>
triggers属性接受一组触发器