赞
踩
Spring Boot 中提供了一种非常简单的定时任务的实现方式 @Scheduled 注解,只需要加两个注解就可以轻松搞定。
@Scheduled在 Spring Boot 中要想使用 @Scheduled 注解,先要在启动类上加上注解 @EnableScheduling
@Configuration @EnableScheduling public class ScheduleConfig { } @Component public class ScheduleTask { private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleTask.class); // 每秒触发一次 @Scheduled(cron = "* * * * * ?") public void printLog() { LOGGER.warn("执行定时任务"); } }
事实上在 Spring Boot 管理的类上都是可以生效的,比如 @Component @Configuration注解都是可以生效的,只需要配置一次即可,建议配置到启动类或者单独的配置类,方便阅读和定位问题。
注意:
@Component,将 Bean 交给 Spring 管理才可以执行定时任务@Lazy 修饰导致 Spring Boot 在启动的时候没有实例化,那定时任务就不会开始执行。@Lazy
@Component
public class ScheduleTask {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleTask.class);
// 此时定时任务不会被执行
@Scheduled(cron = "* * * * * ?")
public void printLog() {
LOGGER.warn("执行定时任务");
}
}
@Scheduled 注解fixedRate:隔指定时间调用一次,不管任务是否执行完;fixedDelay:任务执行完后隔指定时间再调用;cron: 按表达式执行,可以通过工具网站来快速生成 https://cron.qqe2.com/以上三个属性只能选择一个,详见 org.springframework.scheduling.annotation.Scheduled 类中的注释内容
Annotation that marks a method to be scheduled. Exactly one of the @link #cron}, {@link #fixedDelay}, or {@link #fixedRate} attributes must be pecified.
所以在 cron 表达式的定时任务未完成又到了执行时间,同样是不会继续执行的。具体可以参考
如果仍然需要执行可以添加@Async 注解,将方法设置为异步。
而 cron 表达式一般情况下也不会写死,通常都是将 cron 作为配置放到 yml 配置文件中,方便修改维护
@Scheduled(cron = "${cron:* * * * * ?}")
public void printLog() {
LOGGER.warn("执行定时任务");
}
# yml 文件中的配置内容,如果没有配置则会执行默认值 * * * * * ?
cron: 0/5 * * * * ?
动态修改配置文件,则可以使用 Apollo 实现
多线程任务在 Spring Boot 2.0 及其之前的版本都需要实现 SchedulingConfigurer 接口,2.1 版本后提供了自动配置类 TaskSchedulingAutoConfiguration,实际操作可以根据 TaskSchedulingProperties的配置项添加所需配置到 yml 文件。
2.0 以前的实现方式
@Configuration @EnableScheduling public class ScheduleConfig implements SchedulingConfigurer { @Bean("scheduledThreadPoolExecutor") public Executor scheduledThreadPoolExecutor() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setThreadNamePrefix("foxScheduling-"); scheduler.setPoolSize(10); return scheduler; } @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { scheduledTaskRegistrar.setScheduler(scheduledThreadPoolExecutor()); } }
2.1 以后版本只需要修改配置即可
spring:
task:
scheduling:
pool:
# 最大线程数,默认是 1
size: 10
# 线程名称前缀,默认是 scheduling-
thread-name-prefix: foxScheduling-
通过配置开关定时任务有几种思路:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。