Spring Boot中的定时任务

228 阅读1分钟

选型

在Spring Boot中使用定时任务总共有两种方式:

  • scheduled
  • quartz

使用哪种方式去实现个人认为只需要考虑如下方面:

  • 非常简单的定时任务 -> @Scheduled注解
  • 调度较为复杂 -> quartz
  • 任务需要非阻塞 -> quartz
  • 分布式 -> quartz

好吧, 就是最简单的任务用scheduled, 复杂的上quartz

本文暂时只讲解scheduled, quartz后面看懒不懒再补

scheduled

开启定时任务

我们只需要在启动类上增加@EnableScheduling注解即可

@EnableScheduling
@SpringBootApplication
public class Application {
  /**
   * main方法
   *
   * @param args 参数
   */
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

}

编写定时任务

我们只需要在方法上增加@Scheduled注解即可:

public class Task {

    @Scheduled(cron="0/5 * *  * * ? ")
    public void run() {
        // 任务逻辑
    }

}

@Scheduled注解中的具体参数可以阅读这篇文档

在这里特别讲解下使用中需要注意的几点:

  1. "0/5 * * * * ? ", 是指每五秒中运行一次, 但是从整点开始的, 即每分钟的0/5/10/15...依次执行, 并不是从你启动项目的时候开始

  2. 要想从项目启动开始, 应使用fixedDelay参数, 如@Scheduled(fixedDelay=5000), 其内容单位为毫秒, 即上次任务执行完毕后5秒启动下一个任务

  3. fixedDelayString参数支持SpEL表达式, 单位仍为毫秒, 可以使任务时间可配置, 如@Scheduled(fixedDelayString = "${task.interval}")