从实现技术上来看,定时器分为三种:
1.Timer比较单一,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行,一般用的较少。
2.Quartz是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来有些复杂。
3.Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
从作业类继承分类主要分为两类:
1.作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。
2.作业类即普通的java类,不需要继承自任何基类。
从任务调度的触发机制来分,主要有以下两种:
1.每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
2.每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean
现在,我们讲讲Spring3.0的task,<task:annotation-driven/>的作用就是开启定时器开关,自动扫描程序中带注解的定时器,不过,要让他起作用还需要以下配置:
首先在配置文件头部的必须要有:
xmlns:task="http://www.springframework.org/schema/task"
其次xsi:schemaLocation必须为其添加:
xsi:schemaLocation=" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"
然后spring扫描过程必须涵盖定时任务类所在的目录:
<context:component-scan base-package="com.task.service" />
com.task.service属于定时任务类的父级甚至更高级 ,然后设置动作启用定时任务:
<task:annotation-driven/>
最后一步,设置任务类,添加注解
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class Test { @Scheduled(cron = "*/5 * * * * ?")//每隔5秒执行一次 public void test() throws Exception { System.out.println("sms msg has working!"); } //@Scheduled(cron = "0 0 1 * * ?")//每天凌晨1点整 //@Scheduled(cron = "0 30 0 * * ?")//每天凌晨0点30分 //@Scheduled(cron = "0 */60 * * * ?")//1小时处理一次 }
1.@Scheduled(cron = "0 10 * * * ?")
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year或
Seconds Minutes Hours DayofMonth Month DayofWeek
2.@Scheduled(fixedDelay = 10000)
fixedDelay 的执行规则是上一个任务结束后到下个任务开始的间隔时间为设定时间,单位是毫秒(例:@Scheduled(fixedDelay = 10000)代表间隔10秒执行一次)
3.@Scheduled(fixedRate= 10000)
fixedRate表示上个任务开始到下个任务开始之间的间隔时间,单位也是毫秒。
4.@Scheduled(initialDelay= 10000)
这个代表第一次运行前延迟一段时间后执行,单位也是毫秒
当定时任务比较多的时候,我们还可以添加以下配置:
<!-- 配置任务线性池 --> <!-- 任务执行器线程数量 --> <task:executor id="executor" pool-size="3" /> <!-- 任务调度器线程数量 --> <task:scheduler id="scheduler" pool-size="3" /> <!-- 启用annotation方式 --> <task:annotation-driven scheduler="scheduler" executor="executor" proxy-target-class="true" />
当使用项目集群的时候,注解就要不要用了,改成xml配置方式:
<task:scheduled-tasks scheduler="scheduler"> <!-- xml配置定时器,ref是定时器所在类名,method是定时器方法名 --!> <task:scheduled ref="reminderProcessor" method="process" cron="0 0 12 * * ?" /> </task:scheduled-tasks>