很多时候,都需要使用定时调度,比如每隔一段时间运行一个爬虫爬取新的数据,实现方法有Quartz,spring task和Timer
spring task可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包
推荐使用注解式实现
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class WebTask { // 每五秒执行一次 @Scheduled(cron = "0/5 * * * * ?") public void TaskJob() { System.out.println("test"); } }
在相关的配置下加个这句配置,不用其他参数
<task:annotation-driven />
cron的具体解析如下
字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可选) 留空, 1970-2099 , - * /
栗子
CRON表达式 含义 "0 0 12 * * ?" 每天中午十二点触发 "0 15 10 ? * *" 每天早上10:15触发 "0 15 10 * * ?" 每天早上10:15触发 "0 15 10 * * ? *" 每天早上10:15触发 "0 15 10 * * ? 2005" 2005年的每天早上10:15触发 "0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发 "0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发 "0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 "0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发 "0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发 "0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发
Quartz的配置比较繁琐,首先要引入spring的quartz包。
现在开始第一步,新建一个任务类,没有什么配置,只是一个简单类
public class Job { public void doJob() { System.out.println("进展中"); } }
第二步,配置任务类
<bean id="job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="com.Job" /> </property> <property name="targetMethod" value="doJob" /> <property name="concurrent" value="false" /><!– 作业不并发调度 –> </bean>
这一步是关键步骤,声明一个MethodInvokingJobDetailFactoryBean,有两个关键属性:targetObject指定任务类,targetMethod指定运行的方法
第三部,配置触发器
<!-- 定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 指定Tirgger绑定的Job -->
<property name="jobDetail" ref="job"/>
<!-- 指定Cron 的表达式 ,当前是每隔1s运行一次 -->
<property name="cronExpression" value="0/1 * * * * ?" />
</bean>
第四部,配置调度工厂
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean>
Timer 是Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。(暂不学习)