📜  Spring Boot-调度(1)

📅  最后修改于: 2023-12-03 15:20:12.999000             🧑  作者: Mango

Spring Boot-调度

介绍

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 注解允许使用五种不同的参数表达式:

  • fixedRate:定时执行,每隔固定时间执行一次。
  • fixedDelay:固定周期执行,当前执行完成后,等待指定的时间再次执行。
  • initialDelay:延迟启动,启动后延迟指定时间再执行。
  • cron:允许使用cron表达式进行任务调度。
  • zone:指定时区。
@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 注解的使用,可以很容易地实现定时任务和异步任务,并能够灵活地进行配置和调整,提高了程序的执行效率和稳定性。