spring boot 定时任务

使用 springboot 创建定时任务大概有三种方法

  1. 使用注解 @Scheduled
  2. 使用接口 SchedulingConfigurer
  3. 使用注解设定多线程定时任务

使用注解

基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。

通过 fixedDelay 参数指定间隔

package cn.codeo.scheduled.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.time.LocalDateTime;

@Configuration
@EnableScheduling
public class DemoScheduled {
    @Scheduled(fixedDelay = 5000)
    private void print(){
        System.out.println(LocalDateTime.now());
    }
}

程序将输出以下结果

2022-03-13T19:29:28.478
2022-03-13T19:29:33.486
2022-03-13T19:29:38.492
2022-03-13T19:29:43.500

通过 cron 设置定时执行 什么是 cron ?

cron 的参数 <秒> <分> <时> <天> <月> <周>

? 号表示忽略这个参数只能用于

package cn.codeo.scheduled.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.time.LocalDateTime;

@Configuration
@EnableScheduling
public class DemoScheduled {
//    @Scheduled(fixedDelay = 5000)
    @Scheduled(cron = "*/5 * * * * ?")
    private void print(){
        System.out.println(LocalDateTime.now());
    }
}

程序会输出以下结果

2022-03-13T19:44:35.043
2022-03-13T19:44:40.016
2022-03-13T19:44:45.004
2022-03-13T19:44:50.007

使用接口 SchedulingConfigurer

需要继承 SchedulingConfigurer 并实现 configureTasks 方法

样例代码

package cn.codeo.scheduled.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.time.LocalDateTime;

@Configuration
@EnableScheduling
public class Demo2Scheduled implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addCronTask(()->System.out.println(LocalDateTime.now()),"*/5 * * * * *");
    }
}

样例输出

2022-03-13T19:58:25.014
2022-03-13T19:58:30.001
2022-03-13T19:58:35.014
2022-03-13T19:58:40.007

使用异步

@Scheduled 配合 @Async 注解可以实现异步任务

类似文章