📅  最后修改于: 2023-12-03 15:20:12.999000             🧑  作者: Mango
Spring Boot-调度(Scheduling)是指通过定时任务、异步任务等方式来控制应用程序的执行时间、周期和优先级等,能够使得程序更加高效、稳定的运行。在Spring Boot中,调度可以通过内置的 @Scheduled
注解来进行配置和实现。
在pom文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
在需要调度的方法上添加 @Scheduled
注解,如:
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", new Date());
}
}
这里以日志打印当前时间为例,使用 @Scheduled(fixedRate = 5000)
定义了一个每隔5秒执行一次的定时任务。
在 application.properties
中配置线程池大小和队列长度等:
# 线程池核心线程数
spring.task.scheduling.pool.core-size=5
# 线程池最大线程数
spring.task.scheduling.pool.max-size=10
# 队列大小
spring.task.scheduling.pool.queue-capacity=1000
@Scheduled
注解允许使用五种不同的参数表达式:
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", new Date());
}
@Scheduled(fixedDelay = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", new Date());
}
@Scheduled(initialDelay = 5000, fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", new Date());
}
@Scheduled(cron = "0 15 10 ? * MON-FRI")
public void reportCurrentTime() {
log.info("The time is now {}", new Date());
}
@Scheduled(fixedRate = 5000, zone = "GMT+8")
public void reportCurrentTime() {
log.info("The time is now {}", new Date());
}
一个类中可以定义多个定时任务。只需要在每个任务上添加相应的注解即可。
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", new Date());
}
@Scheduled(cron = "0 */1 * * * ?")
public void reportTask1() {
log.info("Task 1 running at {}", new Date());
}
@Scheduled(initialDelay = 1000, fixedRate = 5000)
public void reportTask2() {
log.info("Task 2 running at {}", new Date());
}
}
在Spring Boot中,可以使用 @Async
注解来实现异步任务。只需要在需要异步执行的方法上添加 @Async
注解即可。需要注意的是,使用异步任务需要配置 @EnableAsync
注解。
@Configuration
@EnableAsync
public class AppConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("AsynchThread-");
executor.initialize();
return executor;
}
}
@Service
public class MyService {
@Async("taskExecutor")
public void doSomething() {
// 异步执行任务
}
}
Spring Boot-调度提供了一种简单、方便、高效的定时任务和异步任务调度方式。通过 @Scheduled
注解和 @Async
注解的使用,可以很容易地实现定时任务和异步任务,并能够灵活地进行配置和调整,提高了程序的执行效率和稳定性。