企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
```java org.springframework.scheduling.annotation.Scheduled public @interface Scheduled { String CRON_DISABLED = "-"; String cron() default ""; String zone() default ""; long fixedDelay() default -1L; String fixedDelayString() default ""; long fixedRate() default -1L; String fixedRateString() default ""; long initialDelay() default -1L; String initialDelayString() default ""; TimeUnit timeUnit() default TimeUnit.MILLISECONDS; } ``` **1. cron** 使用 cron 表达式来指定任务执行时间。 ```java @Scheduled(cron = "0/10 * * * * ?") ``` 1. 当 cron 指定的时间小于任务执行所需的时间,则两次任务执行的间隔为:任务执行所需的时间 + 1s。 ```java @Scheduled(cron = "0/3 * * * * ?") public void cronJob2() { try { //执行完该任务需要 5s Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("[cronJob]"); } ///任务间隔为:执行完任务所需的时间 + 1s,所以是 6s。 //2023-05-30 19:31:32 ...: [cronJob] //2023-05-30 19:31:38 ...: [cronJob] //2023-05-30 19:31:44 ...: [cronJob] //2023-05-30 19:31:50 ...: [cronJob] //2023-05-30 19:31:56 ...: [cronJob] ``` 2. 当 cron 指定的时间大于等于任务执行完所需的时间,则两次任务执行的间隔为 cron 指定的时间。 ```java @Scheduled(cron = "0/5 * * * * ?") public void cronJob2() { try { //执行完该任务需要 3s Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("[cronJob]"); } ///两次任务执行间隔为:cron指定的时间,即 5s。 //2023-05-30 19:36:38 ...: [cronJob] //2023-05-30 19:36:43 ...: [cronJob] //2023-05-30 19:36:48 ...: [cronJob] //2023-05-30 19:36:53 ...: [cronJob] //2023-05-30 19:36:58 ...: [cronJob] ``` <br/> **2. zone** 指定时区,如北京时区`Asia/BeiJing`、上海时区`Asia/Shanghai`等等,使用默认的空即可。 <br/> **3. timeUnit** 指定 fixedDelay/fixedDelayString、fixedRate/fixedRateString、initialDelay/initialDelayString 执行的时间单位,默认是毫秒`TimeUnit.MILLISECONDS`。 <br/> **4. fixedDelay / fixedDelayString** 假设时间单位是秒`TimeUnit.SECONDS`,则表示每 fixedDelay 秒执行一次。 ``` //fixedDelayString 与 fixedDelay 功能相同,不过它可以使用占位符写法 @Scheduled(fixedDelayString = "${fixedDelayString:2}", timeUnit = TimeUnit.SECONDS) ``` ```java @Scheduled(fixedDelay = 5, timeUnit = TimeUnit.SECONDS) public void fixedDelay() { try { //任务执行完只需2s Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("[fixedDelay]"); } ///任务间隔为:fixedDelay + 当前任务执行完所需的时间,所以是 7s。 2023-05-30 19:12:02 ...: [fixedDelay] 2023-05-30 19:12:09 ...: [fixedDelay] 2023-05-30 19:12:16 ...: [fixedDelay] 2023-05-30 19:12:23 ...: [fixedDelay] 2023-05-30 19:12:30 ...: [fixedDelay] 2023-05-30 19:12:37 ...: [fixedDelay] 2023-05-30 19:12:44 ...: [fixedDelay] ``` <br/> **5. fixedRate / fixedRateString** 假设时间单位是秒`TimeUnit.SECONDS`,则表示每 fixedRate 秒执行一次。 ``` //fixedRateString 与 fixedRate 功能相同,不过它可以使用占位符写法 @Scheduled(fixedRateString = "${fixedRateString:2}", timeUnit = TimeUnit.SECONDS) ``` 1. 当 fixedRate 指定的时间大于等于任务执行所需的时间,则两次任务的间隔就是 fixedRate。 ```java @Scheduled(fixedRate = 5, timeUnit = TimeUnit.SECONDS) public void fixedRate() { try { //任务执行完只需2s Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("[fixedRate]"); } ///任务间隔为 fixedRate = 5 s //2023-05-30 18:37:39 ...: [fixedRate] //2023-05-30 18:37:44 ...: [fixedRate] //2023-05-30 18:37:49 ...: [fixedRate] //2023-05-30 18:37:54 ...: [fixedRate] //2023-05-30 18:37:59 ...: [fixedRate] ``` 2. 当 fixedRate 指定的时间小于任务执行所需的时间,则两次任务的间隔为任务执行所需的时间。 ```java @Scheduled(fixedRate = 2, timeUnit = TimeUnit.SECONDS) public void fixedRate() { try { //任务执行完需5s Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("[fixedRate]"); } ///任务间隔为当前任务执行完所需的时间 5s,注意与 fixedDelay 的区别。 //2023-05-30 18:42:04 ...: [fixedRate] //2023-05-30 18:42:09 ...: [fixedRate] //2023-05-30 18:42:14 ...: [fixedRate] //2023-05-30 18:42:19 ...: [fixedRate] ``` <br/> **6. initialDelay / initialDelayString** 假设时间单位是秒`TimeUnit.SECONDS`,则表示项目启动后延迟 initialDelay 秒才执行定时任务。 ```java @Scheduled(fixedRate = 2, initialDelay = 5, timeUnit = TimeUnit.SECONDS) //initialDelayString 与 initialDelay 功能相同,不过可以使用占位符写法 @Scheduled(fixedRate = 2, initialDelayString = "${initialDelayString:2}", timeUnit = TimeUnit.SECONDS) ``` 如果使用 cron 表达式,则不能指定该参数,否则报错。 ```java @Scheduled(cron = "0/10 * * * * ?", initialDelay = 5) public void cronJob() { log.info("[cronJob|now]"); } Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'cronJob': 'initialDelay' not supported for cron triggers ```