1.在spring配置文件spring-mybatis.xml(部分技术人员称为applicationContext.xml)引入定时任务的命名空间,如下图:
添加部分如下:
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.0.xsd"
这里遇到一个坑是 http://www.springframework.org/schema/task/spring-task-4.0.xsd" default-lazy-init="true"> 如果有default-lazy-init="true"定时任务不执行。设为false或不添加该部分,则可以执行。
2.配置包扫描、线程池 驱动方式:
<!--配置包扫描-->
<context:component-scan base-package="com.util.timer" />
<!-- 配置定时任务的线程池 -->
<task:executor id="executor" pool-size="5"/>
<!-- 启用scheduler方式 -->
<task:scheduler id="scheduler" pool-size="10"/>
<!-- 启用注解驱动的定时任务 -->
<task:annotation-driven executor="executor" scheduler="scheduler"/>
3.编写定时任务业务逻辑代码:
package com.util.timer;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 定时任务工具类
*/
@Scheduled(cron="0/10 * * * * ? ") //每10秒执行一次
public void testTask() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(new Date())+"*********testTask每10秒执行一次");
}
在这过程中绕了一些弯路,如不启动服务器,直接在main方法和@Test单元测试中测试,发现只打印一次,或在指定的时间不执行定时任务。百思不得其解,后来把服务器启动,终于隔10秒打印一次了,也能指定的时间执行定时任务了。
如指定@Scheduled(cron="0 10 17 * * ? ") 则在每天17:10执行该定时任务。