第一种使用Schedule这个定时器
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
先在启动类上加@EnableScheduling开启Schedule定时器
然后写自定义定时任务,每个方法都是一个任务方法上用@Scheduled这个注解,注解里的是表达式,表示多长时间执行一次
package com.buba.schedule;
import com.buba.mapper.WitkeyDemandApplyMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class DemandSchedule {
@Autowired
private WitkeyDemandApplyMapper witkeyDemandApplyMapper;
//每天凌晨执行一次
@Scheduled(cron = "0 0 0 * * ? ")
public void processUpdateApplyStatus(){
witkeyDemandApplyMapper.updateAllApplyOverdue();
}
//一秒一次
@Scheduled(cron = "0/1 * * * * ? ")
public void test1(){
System.out.println("一秒一次");
}
//两秒一次
@Scheduled(cron = "0/2 * * * * ? ")
public void test2(){
System.out.println("两秒一次");
}
}
写好后直接启动项目定时器就自己执行了
可以看到三个定时任务都已经执行,并且使同一个线程中串行执行,如果只有一个定时任务,这样做肯定没问题,当定时任务增多,如果一个任务卡死,会导致其他任务也无法执行。
多线程执行
在传统的Spring项目中,我们可以在xml配置文件添加task的配置,而在SpringBoot项目中一般使用config配置类的方式添加配置,所以新建一个AsyncConfig类
@Configuration
@EnableAsync
public class AsyncConfig {
/*
此处成员变量应该使用@Value从配置中读取
*/
private int corePoolSize = 10;
private int maxPoolSize = 200;
private int queueCapacity = 10;
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.initialize();
return executor;
}
}
@Configuration:表明该类是一个配置类
@EnableAsync:开启异步事件的支持
然后在定时任务的类或者方法上添加@Async 。最后重启项目,每一个任务都是在不同的线程中