1. Scheduled定时任务器, 是Spring3.0以后自带的一个定时任务器。
2. 使用maven构建SpringBoot的名叫spring-boot-scheduled项目
3. 添加对Scheduled支持的坐标
4. pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjbs</groupId>
<artifactId>spring-boot-scheduled</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<!-- 修改jdk版本 -->
<properties>
<java.version>1.8</java.version>
<!-- 指定thymeleaf和thymeleaf-layout-dialect高版本可以防止html标签不规范报错 -->
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<!-- springBoot的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springBoot thymeleaf的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 添加对Scheduled支持的坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
</dependencies>
</project>
5. 新建UserService.java
package com.bjbs.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void addUser() {
System.out.println("Add User......");
}
}
6. 新建ScheduledDemo.java
package com.bjbs.scheduled;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.bjbs.service.UserService;
/**
* Scheduled定时任务
*/
@Component
public class ScheduledDemo {
@Autowired
private UserService userService;
/**
* 定时任务方法
*
* @Scheduled: 设置定时任务 cron属性: cron表达式。定时任务触发是时间的一个字符串表达形式
*/
@Scheduled(cron = "0/2 * * * * ?")
public void scheduledMethod() {
System.out.println("定时器被触发: " + new Date());
userService.addUser();
}
}
7. 新建App.java
package com.bjbs;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* SpringBoot启动类
*/
@SpringBootApplication
@EnableScheduling // 在启动类上, 添加开启定时任务的注解
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
8. 运行项目
9. cron表达式讲解
9.1. cron表达式是一个字符串, 分为6或7个域, 每一个域代表一个含义, 两种语法格式:
9.1.1. Seconds Minutes Hours Day Month Week
9.1.2. Seconds Minutes Hours Day Month Week Year
9.2. corn从左到右用空格隔开: 秒 分 小时 月份中的日期 月份 星期 年份。
9.3. cron表达式的时间字段除允许设置数值外, 还可使用一些特殊的字符, 提供列表、范围、通配符等功能。
9.4. 各字段的含义
位置 |
时间域名 |
允许值 |
允许的特殊字符 |
1 |
秒 |
0-59 |
, - * / |
2 |
分钟 |
0-59 |
, - * / |
3 |
小时 |
0-23 |
, - * / |
4 |
日 |
1-31 |
, - * ? / L W C |
5 |
月 |
1-12 |
, - * / |
6 |
星期 |
1-7 |
, - * ? / L C # |
7 |
年(可选) |
1970-2099 |
, - * / |
9.5. 星号(*): 可用在所有字段中, 表示对应时间域的每一个时刻, 例如: *在分钟字段时, 表示"每分钟"。
9.6. 问号(?): 该字符只在月份中的日期和星期字段中使用, 它通常指定为"无意义的值", 相当于占位符。
9.7. 减号(-): 表达一个范围, 如在小时字段中使用"10-12", 则表示从10到12点, 即: 10,11,12。
9.8. 逗号(,): 表达一个列表值, 如在星期字段中使用"MON,WED,FRI", 则表示星期一、星期三和星期五。
9.9. 斜杠(/): x/y表达一个等步长序列, x为起始值, y为增量步长值。如在分钟字段中使用0/15, 则表示为0,15,30和45秒; 而5/15在分钟字段中表示5,20,35,50; 你也可以使用*/y, 它等同于0/y。
9.10. L: 该字符只在月份中的日期和星期字段中使用, 代表"Last"的意思。L在日期字段中, 表示这个月份的最后一天, 如: 一月的31号, 非闰年二月的28号。如果L用在星期中, 则表示星期六, 等同于7。但是, L在星期字段里, 而且在前面有一个数值D, 则表示"这个月的最后星期D", 例如: 6L表示该月的最后星期五。
9.11. W: 该字符只能出现在月份中的日期字段里, 是对前导日期的修饰, 表示离该日期最近的工作日。例如: 15W表示离该月15号最近的工作日, 如果该月15号是星期六, 则匹配14号星期五; 如果15日是星期日, 则匹配16号星期一; 如果15号是星期二, 那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月, 如你指定1W, 如果1号是星期六, 结果匹配的是3号星期一, 而非上个月最后的那天。W字符串只能指定单一日期, 而不能指定日期范围。
9.12. LW组合: 在月份中的日期字段可以组合使用LW, 它的意思是当月的最后一个工作日。
9.13. 井号(#): 该字符只能在星期字段中使用, 表示当月某个工作日。如: 6#3表示当月的第三个星期五(6表示星期五, #3表示当前的第三个), 而4#5表示当月的第五个星期三, 假设当月没有第五个星期三, 忽略不触发。
9.14. C: 该字符只在月份中的日期和星期字段中使用, 代表"Calendar"的意思。它的意思是计划所关联的日期, 如果日期没有被关联, 则相当于日历中所有日期。例如: 5C在日期字段中就相当于日历5日以后的第一天。 1C在星期字段中相当于星期日后的第一天。
9.15. cron表达式对特殊字符的大小写不敏感, 对代表星期的缩写英文大小写也不敏感。