spring boot 定时任务
- 使用注解 @Scheduled
- 使用接口
SchedulingConfigurer
- 使用注解设定多线程定时任务
使用注解
基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。
通过 fixedDelay
参数指定间隔
package cn.codeo.scheduled.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import java.time.LocalDateTime; @Configuration @EnableScheduling public class DemoScheduled { @Scheduled(fixedDelay = 5000) private void print(){ System.out.println(LocalDateTime.now()); } }
程序将输出以下结果
2022-03-13T19:29:28.478
2022-03-13T19:29:33.486
2022-03-13T19:29:38.492
2022-03-13T19:29:43.500
通过 cron
设置定时执行 什么是 cron ?
cron 的参数 <秒> <分> <时> <天> <月> <周>
? 号表示忽略这个参数,只能用于天和周
package cn.codeo.scheduled.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDateTime;
@Configuration
@EnableScheduling
public class DemoScheduled {
// @Scheduled(fixedDelay = 5000)
@Scheduled(cron = "*/5 * * * * ?")
private void print(){
System.out.println(LocalDateTime.now());
}
}
程序会输出以下结果
2022-03-13T19:44:35.043
2022-03-13T19:44:40.016
2022-03-13T19:44:45.004
2022-03-13T19:44:50.007
使用接口 SchedulingConfigurer
需要继承 SchedulingConfigurer
并实现 configureTasks
方法
样例代码
package cn.codeo.scheduled.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import java.time.LocalDateTime; @Configuration @EnableScheduling public class Demo2Scheduled implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addCronTask(()->System.out.println(LocalDateTime.now()),"*/5 * * * * *"); } }
样例输出
2022-03-13T19:58:25.014
2022-03-13T19:58:30.001
2022-03-13T19:58:35.014
2022-03-13T19:58:40.007
使用异步
@Scheduled
配合 @Async
注解可以实现异步任务