项目中实现定时任务有多种方式,除了TimerTask这种小工具之外,以下两种比较常用:
项目中暂时没有用Quartz,本次使用的是Spring框架封装的定时任务工具,使用起来比较简单。
如果要使用Spring Task,需要在spring配置文件里增加如下内容:
<beans xmlns="http://www.springframework.org/schema/beans" ... xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans .... http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> ... </bean>
举例,自己项目中的Spring.xml文件内容如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> ... </bean>
在spring.xml文件中配置自动扫描包路径 和 Task注解扫描:
<!--扫描标记@Scheduled注解的定时任务--> <task:annotation-driven/> <!--扫描路径--> <context:component-scan base-package="com.crocutax.test.schedule"/>
注意
如果上一步没有配置好,即使这里已经配置了驱动及扫描,运行的时候依然会报如下异常:
Caused by: org.xml.sax.SAXParseException; lineNumber: 62; columnNumber: 30; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'task:annotation-driven' 的声明。
在想要定时执行的方法上添加 @Scheduled
注解,及 Cron表达式
即可。
@Component public class TimeoutTask { @Scheduled(cron = "0 0 */1 * * ?") //每1小时执行一次 public void test() { System.out.println("定时任务执行了............."); } }
@Scheduled
注解的方法会被第二步配置的扫描器扫描到,注入Spring容器,执行该方法中的任务。 Cron表达式
则定义了执行该任务的周期,频率。 SpringTask和Quartz使用的Cron语法是一样的。
参考链接:
http://www.ibloger.net/article/2636.html
http://www.jianshu.com/p/13623119cb5b
http://www.what21.com/sys/view/java_java-frame_1478840380252.html
(完)