spring Scheduled

@Scheduled

Spring 提供了 @Scheduled 注解来实现 定时任务,@Scheduled() 参数可以接受 两种 定时的设置,一种是我们常用的 格林时间表达式 cron = "*/10 * * * * *",另一种是 fixedRate = 10 * 1000L,(给出的两个例子都表示每隔 10 秒执行一次目标任务)。

在 Spring Boot 入口类 或者 定时任务函数所在类 上配置 @EnableScheduling 注解开启 Spring 自带的定时处理功能。

使用该注解时,默认是基于单线程的任务调度。如何实现多线程的任务处理?下面提供两种参考方案。

SchedulingConfigurer

Spring Boot 提供了一个 SchedulingConfigurer 配置接口。通过 ScheduleConfig 配置文件实现 ScheduleConfiguration 接口,并重写 configureTasks() 方法,向 ScheduledTaskRegistrar 注册一个 ThreadPoolTaskScheduler 任务线程对象可以实现多线程处理, 提高延时任务的并发处理能力。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
public class ScheduleConfiguration implements SchedulingConfigurer {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleConfiguration.class);

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(taskScheduler());
}

@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(4);
return taskScheduler;
}
}

配合@Async使用

  1. 可以在一个函数上同时使用@Scheduled@Async两个注解来实现
  2. 可以使用@Scheduled对定时任务进行注解,在定时任务中调用使用@Async注解的异步任务函数。