天天看点

springboot2 定时任务:同步 异步 多线程 延迟执行,cron详解

  1. pom.xml 引入 springboot 相关依赖
  2. 入口类加 @EnableScheduling注解(有些版本不加该注解也会执行定时任务。请注意:有些版本即使注释掉该注解,也会执行定时任务)
@SpringBootApplication
@EnableScheduling
public class XXXApplication {
}
           
  1. 建立AsyncTaskConfig类(配置多线程异步任务)
@Configuration
@EnableAsync
public class AsyncTaskConfig {
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setKeepAliveSeconds(1800);
        executor.setMaxPoolSize(1000);
        executor.setQueueCapacity(500);
        executor.initialize();
        return executor;
    }
}
           
  1. 建立具体的任务类
@Component
public class MyTask {
    // @Async 表示使用异步
    // @Scheduled:initialDelay:启动时延迟 1 秒执行,fixedRate:3秒执行一次
    @Async
    @Scheduled(initialDelay = 1000, fixedRate = 3000)
    public void doing() {
        System.out.println("3秒一次");
    }

    // @Async 表示使用异步
    // @Scheduled:cron :每6秒执行一次。周期:秒 分 时 日 月 周
    @Async
    @Scheduled(initialDelay = 1000, cron = "*/6 * * * * *")
    public void doing2() {
        System.out.println("6秒一次");
    }
}
           
cron 表达式详解
cron表达式时间依次表示:秒 分 时 日 月 周
* 表示该时间段的所有时间。日和周可以用 ? 代替 * 

┌───────────── second (0-59)
│ ┌───────────── minute (0 - 59)
│ │ ┌───────────── hour (0 - 23)
│ │ │ ┌───────────── day of the month (1 - 31)
│ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
│ │ │ │ │ ┌───────────── day of the week (0 - 7)
│ │ │ │ │ │          (0 or 7 is Sunday, or MON-SUN)
│ │ │ │ │ │
* * * * * *

举一些例子:

"0 0 * * * *" = 每小时 0 分 0 秒
"*/10 * * * * *" = 每 10 秒
"0 0 8-10 * * *" = 每天的 8,9,10点
"0 0 6,19 * * *" = 每天的 6-19 点
"0 0/30 8-10 * * *" = 每天的 8:00, 8:30, 9:00, 9:30, 10:00, 10:30
"0 0 9-17 * * MON-FRI" = 周一到周五的 9-17 点
"0 0 0 25 12 ?" = 每个圣诞节的午夜
"0 0 0 L * *" = 每月最后一天午夜
"0 0 0 L-3 * *" = 每月第三至最后一天午夜
"0 0 0 1W * *" = 每月第一个工作日午夜
"0 0 0 LW * *" = 每月最后一个工作日午夜
"0 0 0 * * 5L" = 每月最后一个星期五午夜
"0 0 0 * * THUL" = 每月最后一个星期四午夜
"0 0 0 ? * 5#2" = 每月的第二个星期五午夜
"0 0 0 ? * MON#1" = 每月的第一个星期一午夜

对于复杂时间段,建议大的时间段用 cron 写,细节的时间段在代码里判断。
           

参考:http://www.fengyunxiao.cn

继续阅读