很多时候,都需要使用定时调度,比如每隔一段时间运行一个爬虫爬取新的数据,实现方法有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任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。(暂不学习)

 

 posted on 2018-01-22 11:50  cosyfish  阅读(97)  评论(0编辑  收藏  举报