一、前言
在工作中我们少不了会用到定时任务的功能,但是哪种方式简单易理解呢,可能大家就不是太清楚了,在下面介绍一下工作中常用到的几种定时任务的使用以及我的个人看法。
二、定时任务(大家都知道定时任务,我在这里就不做过多介绍了,直接上代码)
一、quartz
1) 配置文件:
1 <!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法--> 2 <!-- 定义目标bean和bean中的方法 --> 3 <bean id="SpringQtzJob" class="com.ncs.hj.SpringQtz"/> 4 <bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 5 <property name="targetObject"> 6 <ref bean="SpringQtzJob"/> 7 </property> 8 <property name="targetMethod"> <!-- 要执行的方法名称 --> 9 <value>execute</value> 10 </property> 11 </bean> 12 13 <!-- ======================== 调度触发器 ======================== --> 14 <bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean"> 15 <property name="jobDetail" ref="SpringQtzJobMethod"></property> 16 <property name="cronExpression" value="0/5 * * * * ?"></property> 17 </bean> 18 19 <!-- ======================== 调度工厂 ======================== --> 20 <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 21 <property name="triggers"> 22 <list> 23 <ref bean="CronTriggerBean"/> 24 </list> 25 </property> 26 </bean>
2)透过实例看原理
通过研读Quartz的源代码,和本实例,终于悟出了Quartz的工作原理。
1、scheduler是一个计划调度器容器(总部),容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。
2、JobDetail是一个可执行的工作,它本身可能是有状态的。
3、Trigger代表一个调度参数的配置,什么时候去调。
4、当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一对儿),就可以伴随容器启动而调度执行了。
5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。
6、将上述的结构用一个图来表示,如下:
二、Spring自带的一个设定时间自动任务调度
1 <task:scheduled-tasks> 2 <task:scheduled ref="voiceFileClearJob" method="execute" initial-delay="5000" fixed-delay="3600000"/> 3 <task:scheduled ref="versionListenJob" method="execute" initial-delay="5000" fixed-delay="5000"/> 4 <task:scheduled ref="statJob" method="statLgj" cron="0 59 23 * * ?"/> 5 <task:scheduled ref="statJob" method="statBadNameAndQQ" cron="23 28 20 * * ?"/> 6 </task:scheduled-tasks>
第一个任务表示程序启动5s后调用voiceFileClearJob类中的execute方法,然后每隔一个小时再调用execute一次
第三个任务表示每天的23点59分调用statJob类中的statLgj方法
注意:在spring3.0.6时,如果在xml中加入default-lazy-init="true"后,只在xml中写定时时间还不起作用,还需要在方法上面用@Scheduled(cron = "0 0 2 * * *")
注解写定时时间才起作用,以方法上定义的为准,替换成Sping3.2.2之后,就可以直接在XML中配置,而不需要在方法上使用注解配置时间了。如果不想这样,需要在bean上加个注解@Lazy(value="false")
ref是工作类
method是工作类中要执行的方法
initial-delay是任务第一次被调用前的延时,单位毫秒
fixed-delay是上一个调用完成后再次调用的延时
fixed-rate是上一个调用开始后再次调用的延时(不用等待上一次调用完成)
cron是表达式,表示在什么时候进行任务调度。
三、总结
Spring内部有一个task是Spring自带的一个设定时间自动任务调度
task使用的时候很方便,但是他能做的东西不如quartz那么的多!