目录
定时任务
项目总结
新建一个SpringBoot项目
pom.xml无需引入依赖
SpringTaskDemo
SpringbootSpringtaskApplication启动类
定时任务
- 在日常的项目开发中,往往会涉及一些需要做到定时执行的代码,例如自动将超过24小时的未付款的订单改为取消状态,自动将超过14天客户未签收的订单改为已签收状态等。
- 实现定时任务的方式有很多,但最常用的是基于Spring Task实现定时任务的
- 参考文章:http://t.csdnimg.cn/WVoGU
- Spring Task 是 Spring 框架提供的一种用于处理定时任务的机制,Spring Task的核心实现类位于spring-context包中,在Spring项目中可以直接使用该定时任务类,Spring Task还提供了
@Scheduled
注解来支持定时任务的创建和调度
@Scheduled注解支持的部分配置参数:
- cron:cron表达式,指定任务在特定时间执行
- fixedDelay:表示 上一次任务执行完成后多久再次执行,参数类型:long,单位:ms
- fixedDelayString:和fixedDelay含义一样,只是参数类型变成String
- fixedRate:表示按一定的频率执行任务,参数类型:long,单位:ms
- fixedRateString:与fixedRate的含义一样,只是参数类型变成String
- initialDelay:表示延迟多久再第一次执行任务,参数类型:long,单位:ms
- initialDelayString:与initialDelay含义一样,只是参数类型变成String
- zone :时区,默认为当前时区,一般不用
在线生成cron表达式的网站:
- 1、quartz/Cron/Crontab表达式在线生成工具-BeJSON.com
- 2、在线Cron表达式生成器 - 码工具 (matools.com)
项目总结
- 首先,在 Spring Boot 主类中添加
@EnableScheduling
注解以启用定时任务- 然后,创建一个包含定时任务方法的类,并使用
@Scheduled
注解指定定时任务的触发规则
新建一个SpringBoot项目
项目结构:
pom.xml无需引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.study</groupId>
<artifactId>springboot_springtask</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_springtask</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
SpringTaskDemo
package com.study.springboot_springtask.dingshi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class SpringTaskDemo {
//打印日志
private Logger logger=LoggerFactory.getLogger(SpringTaskDemo.class);
private int fixedDelayCount=1;
private int fixedRateCount=1;
private int initialDelayCount=1;
private int cronCount=1;
@Scheduled(fixedDelay = 5000)
//表示当前方法执行完毕5000ms后,Spring scheduling会再次调用该方法
public void testFixDelay(){
logger.info("=========fixedDelay: 第{}次执行方法",fixedDelayCount++);
}
@Scheduled(fixedRate = 5000)
//表示当前方法开始执行5000ms后,Spring scheduling会再次调用该方法
public void testFixedRate(){
logger.info("=========fixedRate: 第{}次执行方法",fixedRateCount++);
}
@Scheduled(initialDelay = 1000,fixedRate = 5000)
//表示延迟1000ms执行第一次任务
public void testInitialDelay(){
logger.info("=========initialDelay: 第{}次执行方法",initialDelayCount++);
}
@Scheduled(cron = "0 15 10 * * ?")
//cron接受cron表达式,根据cron表达式确定定时规则,表示:每天10:15定时触发执行
public void testCron(){
logger.info("=========cron: 第{}次执行方法",cronCount++);
}
}
SpringbootSpringtaskApplication启动类
package com.study.springboot_springtask;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 开启基于注解的定时任务,发现注解@Scheduled的任务并由后台执行
public class SpringbootSpringtaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootSpringtaskApplication.class, args);
}
}
启动项目: