# Spring 定时任务(XML 配置方式)
## 一、项目说明
### 1.1 项目结构
关于任务的调度配置定义在 `springApplication.xml` 中,为方便观察定时执行的情况,项目以 web 的方式构建。
### 1.2 基本依赖
导入基本依赖:
```xml
5.1.3.RELEASE
org.springframework
spring-context
${spring-base-version}
org.springframework
spring-beans
${spring-base-version}
org.springframework
spring-core
${spring-base-version}
org.springframework
spring-web
${spring-base-version}
org.springframework
spring-webmvc
${spring-base-version}
javax.servlet
javax.servlet-api
4.0.1
provided
```
## 二、Spring Scheduling
### 2.1 创建定时任务
```java
public class Task {
public void methodA() {
Thread thread = Thread.currentThread();
System.out.println(String.format("线程名称:%s ; 线程 ID:%s ; 调用方法:%s ; 调用时间:%s",
thread.getName(), thread.getId(), "methodA 方法执行", LocalDateTime.now()));
}
@Async
public void methodB() throws InterruptedException {
Thread thread = Thread.currentThread();
System.out.println(String.format("线程名称:%s ; 线程 ID:%s ; 调用方法:%s ; 调用时间:%s",
thread.getName(), thread.getId(), "methodB 方法执行", LocalDateTime.now()));
Thread.sleep(10 * 1000);
}
public void methodC() {
Thread thread = Thread.currentThread();
System.out.println(String.format("线程名称:%s ; 线程 ID:%s ; 调用方法:%s ; 调用时间:%s",
thread.getName(), thread.getId(), "methodC 方法执行", LocalDateTime.now()));
}
}
```
### 2.2 配置定时任务
```xml
```
**关于调度程序线程池作用说明**:
如上 methodA 、 methodB 、methodC 三个方法,其中 methodB 是耗时方法,如果不声明调度程序线程池则 methodB 会阻塞 methodA 、methodC 方法的执行 因为调度程序是单线程的。
**关于任务执行线程池作用说明**:
按照上面的例子,如果我们声明 methodB 是按照 fixedRate=5000 方法执行的 ,理论上不管任务耗时多久,任务都应该是每 5 秒执行一次,但是实际上任务是被加入执行队列,并不会立即被执行,因为默认执行任务是单线程的。这个时候需要开启@EnableAsync 注解并指定方法是 @Async 异步的,并且配置执行任务线程池 (如果不配置就使用默认的线程池配置)。