SpringBoot & SpringTask
Spring 自带定时任务 @Scheduled
在线Cron表达式 https://cron.qqe2.com/
1.@Scheduled参数运用
2.单线程测试
3.多线程测试
4.@Scheduled(cron = "${demo.cron}") 占位符格式测试
5.源码分析
导入依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>SpringTaskDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
多线程配置类
/**
* @author WenZiR
* @projectName SpringTaskDemo
* @description: TODO
* @date 2022-04-02 23:04
*/
@Configuration
@EnableAsync
public class SpringTaskConfig {
/**
* 核心线程池大小
*/
@Value("${com.springTask.corePoolSize}")
private int corePoolSize;
/**
* 线程池最大书面
*/
@Value("${com.springTask.maxPoolSize}")
private int maxPoolSize;
/**
* 等待队列大小
*/
@Value("${com.springTask.queueCapacity}")
private int queueCapacity;
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.initialize();
return executor;
}
}
编写application.properties文件
#线程池设置参数
#线程池设置参数
com.springTask.corePoolSize=10
com.springTask.maxPoolSize=200
com.springTask.queueCapacity=10
demo.cron=0/1 * * * * *
测试类
@Component
@Slf4j
public class TestJob {
/**
* 每隔 10s 执行一次
*/
@Scheduled(cron = "0/10 * * * * ?")
public void task1() {
log.info(Thread.currentThread ().getName ()+
"【job1】开始执行:{}", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
/**
* 从启动时间开始,间隔 2s 执行
* 固定间隔时间
*/
@Scheduled(fixedRate = 2000)
public void task2() {
log.info(Thread.currentThread ().getName ()+
"【job2】开始执行:{}", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
/**
* 从启动时间开始,延迟 5s 后间隔 4s 执行
* 固定等待时间
*/
@Scheduled(fixedDelay = 4000, initialDelay = 5000)
public void task3() {
log.info(Thread.currentThread ().getName ()+
"【job3】开始执行:{}", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
/**
* 按照标准时间来算,每隔 1s 执行一次
*/
@Async
@Scheduled(cron = "0/1 * * * * * ")
public void taskAsync1() {
log.info (Thread.currentThread ().getName ()
+ "【job1】开始执行:{}",
LocalDateTime.now ().format (DateTimeFormatter.ofPattern ("yyyy-MM-dd HH:mm:ss")));
// Thread.sleep (10000 *60);
}
/**
* 按照标准时间来算,每隔 1s 执行一次
*/
@Async
@Scheduled(cron = "0/1 * * * * * ")
public void taskAsync2() {
log.info (Thread.currentThread ().getName ()+
"【job2】开始执行:{}",
LocalDateTime.now ().format (DateTimeFormatter.ofPattern ("yyyy-MM-dd HH:mm:ss")));
}
/**
* 按照标准时间来算,每隔 1s 执行一次
*/
@Async
@Scheduled(cron = "0/1 * * * * * ")
public void taskAsync3() {
log.info (Thread.currentThread ().getName ()+
"【job3】开始执行:{}",
LocalDateTime.now ().format (DateTimeFormatter.ofPattern ("yyyy-MM-dd HH:mm:ss")));
}
}
启动类
@SpringBootApplication
@EnableScheduling
public class SpringTaskDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringTaskDemoApplication.class, args);
}
}
测试
- @Scheduled注解基本使用
- 单线程测试
- 多线程测试
- 占位符测试
总结 & 源码分析
public @interface Scheduled {
//cron [秒] [分] [小时] [日] [月] [周] [年]
String cron() default "";
//默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。
//该字段我们一般留空。
String zone() default "";
//默认未开启
long fixedDelay() default -1;
//上一次执行完毕时间点之后**秒再执行 固定等待时间
String fixedDelayString() default "";
//默认未开启
long fixedRate() default -1;
//上一次开始执行时间点之后**秒再执行 固定间隔时间
String fixedRateString() default "";
//默认未开启
long initialDelay() default -1;
//第一次延迟**秒后执行
String initialDelayString() default "";
}
线程池里面有坑