Spring Boot - 定时任务
程序员文章站
2022-05-01 12:43:28
...
1.快速实现
使用@EnableScheduling
注解开启定时任务扫描,通常用在SpringBoot启动类上
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableScheduling
/**
* kotlin的SpringBoot启动类
*/
@EnableScheduling
@SpringBootApplication
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
}
使用@Scheduled
注解定义定时任务及频率(单线程)
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class Task {
private Logger logger = LoggerFactory.getLogger(Task.class);
//定时任务每30秒执行一次
@Scheduled(cron = "*/30 * * * * ?")
public void task1() {
logger.info("定时任务1...");
}
//定时任务每1分钟执行一次
@Scheduled(cron = "0 */1 * * * ?")
public void task2() {
logger.info("定时任务2...");
}
}
如果要使用多线程执行定时任务,仅需要实现SchedulingConfigurer
接口,并使用@Configuration
注解
import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executors;
@Configuration
public class TaskConfig implements SchedulingConfigurer {
@Override
public void configureTasks(@NotNull ScheduledTaskRegistrar taskRegistrar) {
//定时任务使用线程数为10的线程池
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
2.Cron表达式
Cron表达式共有7个位置,其中最后一个位置为可选项
* * * * * * *
位置 | 说明 | 允许值 | 特殊值 |
---|---|---|---|
1 | [秒] | 0-59 | , - * / |
2 | [分] | 0-59 | , - * / |
3 | [小时] | 0-23 | , - * / |
4 | [日] | 1-31 | , - * / ? L W C |
5 | [月] | 1-12 或 JAN-DEC | , - * / |
6 | [周] | 1-7 或 SUN-SAT | , - * / ? L C # |
7(可选) | [年] | 1970-2099 | , - * / |
3.Cron表达式中的特殊值
-
*:
表示匹配该位置的任意值,比如在秒*, 就表示每秒都会触发事件。 -
?:
只能用在[日]和[周]两个位置。表示不指定值,当[日]、[周]其中之一被指定了值以后,为了避免冲突,需要将另一个的值设为“?”。 -
-:
表示范围,例如在[分]使用5-20,表示从5分到20分钟每分钟触发一次。 -
/:
表示起始时间开始触发,然后每隔固定时间触发一次,例如在分域使用5/20,则意味着5分,25分,45分,分别触发一次。 -
,:
表示列出枚举值。例如:在[分]使用5,20,则意味着在5和20分时触发一次。 -
L:
表示最后,只能出现在[周]和[日],如果在[周]使用1L,意味着在最后的一个星期日触发。 -
W:
表示有效工作日(周一到周五),只能出现在[日],系统将在离指定日期的最近的有效工作日触发事件。注意一点,W的最近寻找不会跨过月份。 -
LW:
两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。 -
#:
表示每个月第几个星期几,只能出现在[日]。例如1#3,表示某月的第三个星期日。
4.Cron表达式示例
0 0 * * * * 表示每小时0分0秒执行一次
*/10 * * * * * 表示每10秒执行一次
0 0 8-10 * * * 表示每天8,9,10点执行
0 0/30 8-10 * * * 表示每天8点到10点,每半小时执行
0 0 9-17 * * MON-FRI 表示每周一至周五,9点到17点的0分0秒执行
0 0 0 25 12 ? 表示每年圣诞节(12月25日)0时0分0秒执行
推荐阅读
-
Spring boot进行参数校验的方法实例详解
-
spring-boot整合ehcache实现缓存机制的方法
-
spring boot 即时重新启动(热更替)使用说明
-
使用 Spring Boot 2.0 + WebFlux 实现 RESTful API功能
-
spring boot2.0实现优雅停机的方法
-
spring boot 自定义starter的实现教程
-
spring-boot读取props和yml配置文件的方法
-
详解spring boot引入外部jar包的坑
-
Spring Boot Admin管理监控数据的方法
-
spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)