Spring 定时任务
记录下 cron 表达式的用法,和正则一样,没法记,只能用到时查下。

介绍

本文主要记录下 cron 表达式的用法,方便下次使用。

配置

程序主入口添加 @SpringBootApplication@EnableScheduling 注解以启动定时任务。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class SchedulingTasksApplication {

	public static void main(String[] args) {
		SpringApplication.run(SchedulingTasksApplication.class);
	}
}

然后方法上添加 @Scheduled 注解就行了。当然类注解 @Component 也必不可少。

@Scheduled(fixedDelay = 5000)
public void reportCurrentTime() {
  System.out.println(new Date());
}

定时调度

fixedDelay

毫秒单位,以上一个调用的完成时间开始计算。

如间隔 3 秒,每个任务耗时 2 秒:

@Scheduled(fixedDelay = 3000)
public void errorSpiderRerun(){
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("start " + localDateTime);
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("end " + LocalDateTime.now());
}

结果如下:

start 2020-06-02T15:49:59.650
end 2020-06-02T15:50:01.651
start 2020-06-02T15:50:04.653
end 2020-06-02T15:50:06.653
start 2020-06-02T15:50:09.654
end 2020-06-02T15:50:11.655
start 2020-06-02T15:50:14.657

fixedRate

需要固定速率,则使用 fixedRate

如间隔 3 秒,每个任务耗时 2 秒:

@Scheduled(fixedRate = 3000)
public void errorSpiderRerun(){
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("start " + localDateTime);
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("end " + LocalDateTime.now());
}

结果如下:

start 2020-06-02T15:58:03.563
end 2020-06-02T15:58:05.563
start 2020-06-02T15:58:06.563
end 2020-06-02T15:58:08.563
start 2020-06-02T15:58:09.563
end 2020-06-02T15:58:11.563
start 2020-06-02T15:58:12.563
end 2020-06-02T15:58:14.563

但是若上个任务耗时超过间隔,则下一次也需要在等待,等到结束后下一次立刻执行。

如等待 7 秒后结果如下:

start 2020-06-02T16:02:37.726
end 2020-06-02T16:02:44.727
start 2020-06-02T16:02:44.727
end 2020-06-02T16:02:51.727
start 2020-06-02T16:02:51.727
end 2020-06-02T16:02:58.727
start 2020-06-02T16:02:58.727
end 2020-06-02T16:03:05.728
start 2020-06-02T16:03:05.728

initialDelay

默认项目启动立即执行定时任务,若想要延迟,使用 initialDelay 参数。

@Scheduled(initialDelay = 10000, fixedRate = 3000)

结果如下:

2020-06-02 16:09:00.487 [main] INFO  LabelApplication - Started LabelApplication in 4.901 seconds (JVM running for 5.689)  
start 2020-06-02T16:09:10.467
end 2020-06-02T16:09:15.468

cron 表达式

用法太多了,每次项目用到就记一下吧。

表达式 描述
1 2 3 * * ? * 每天 3 点 2 分 1 秒执行
1 2 3 L * ? * 每月最后一天 3 点 2 分 1 秒执行
1 2 3 4 * ? * 每月 4 号 3 点 2 分 1 秒执行
0 0 12 ? * WED 每周三执行

Last modified on 2020-06-02