欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot - 定时任务

程序员文章站 2022-05-01 12:43:28
...

1.快速实现

使用@EnableScheduling注解开启定时任务扫描,通常用在SpringBoot启动类上

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableScheduling

/**
 * kotlin的SpringBoot启动类
 */
@EnableScheduling
@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

使用@Scheduled注解定义定时任务及频率(单线程)

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Task {

    private Logger logger = LoggerFactory.getLogger(Task.class);

    //定时任务每30秒执行一次
    @Scheduled(cron = "*/30 * * * * ?")
    public void task1() {
        logger.info("定时任务1...");
    }

    //定时任务每1分钟执行一次
    @Scheduled(cron = "0 */1 * * * ?")
    public void task2() {
        logger.info("定时任务2...");
    }
}

如果要使用多线程执行定时任务,仅需要实现SchedulingConfigurer接口,并使用@Configuration注解

import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.Executors;

@Configuration
public class TaskConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(@NotNull ScheduledTaskRegistrar taskRegistrar) {
        //定时任务使用线程数为10的线程池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }
}

2.Cron表达式

Cron表达式共有7个位置,其中最后一个位置为可选项

* * * * * * *
位置 说明 允许值 特殊值
1 [秒] 0-59 , - * /
2 [分] 0-59 , - * /
3 [小时] 0-23 , - * /
4 [日] 1-31 , - * / ? L W C
5 [月] 1-12 或 JAN-DEC , - * /
6 [周] 1-7 或 SUN-SAT , - * / ? L C #
7(可选) [年] 1970-2099 , - * /

3.Cron表达式中的特殊值

  • *
    表示匹配该位置的任意值,比如在秒*, 就表示每秒都会触发事件。
  • ?
    只能用在[日]和[周]两个位置。表示不指定值,当[日]、[周]其中之一被指定了值以后,为了避免冲突,需要将另一个的值设为“?”。
  • -
    表示范围,例如在[分]使用5-20,表示从5分到20分钟每分钟触发一次。
  • /
    表示起始时间开始触发,然后每隔固定时间触发一次,例如在分域使用5/20,则意味着5分,25分,45分,分别触发一次。
  • ,
    表示列出枚举值。例如:在[分]使用5,20,则意味着在5和20分时触发一次。
  • L
    表示最后,只能出现在[周]和[日],如果在[周]使用1L,意味着在最后的一个星期日触发。
  • W
    表示有效工作日(周一到周五),只能出现在[日],系统将在离指定日期的最近的有效工作日触发事件。注意一点,W的最近寻找不会跨过月份。
  • LW
    两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
  • #
    表示每个月第几个星期几,只能出现在[日]。例如1#3,表示某月的第三个星期日。

4.Cron表达式示例

0 0 * * * *            表示每小时0分0秒执行一次
*/10 * * * * *         表示每10秒执行一次
0 0 8-10 * * *         表示每天8,9,10点执行
0 0/30 8-10 * * *      表示每天8点到10点,每半小时执行
0 0 9-17 * * MON-FRI   表示每周一至周五,9点到17点的0分0秒执行
0 0 0 25 12 ?          表示每年圣诞节(12月25日)0时0分0秒执行