我终于会写 Java 的定时任务了!( 四 )


下面是一个简单的定时任务:
@Slf4j@Component@EnableSchedulingpublic class TaskDemo {@Scheduled(cron = "*/1 * * * * ?")public void printTime() throws InterruptedException {log.info("此刻时间 {}", LocalDateTime.now());}}cron 表达式有 6 位,是必须的,从左到右分别表示:秒、分、时、日、月、周
当然也有可能是 7 位,那么最后一位就是年(一般省略不写):秒、分、时、日、月、周、年
取值说明:正常认识,秒分都是 0 - 59,时则是 0 - 23,日则是 1 - 31,月则是 1-12,周则是 1 - 7 。年则只有 1970 - 2099
每一位都可以用数字表示,当然还可以用一些特殊字符表示,比如上面出现的 */1 * * * * ? ,第 1 位的 */1 表示任意秒每隔1秒,第 2 位的 * 表示任意分钟,以此类推 。

详细可参考这里:简书-Cron表达式的详细用法
Cron 生成工具:https://cron.qqe2.com/
上面的代码运行之后,控制台输出:
2022-10-25 14:26:22.013INFO 18304 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 此刻时间 2022-10-25T14:26:22.0132022-10-25 14:26:23.010INFO 18304 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 此刻时间 2022-10-25T14:26:23.0102022-10-25 14:26:24.011INFO 18304 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 此刻时间 2022-10-25T14:26:24.0112022-10-25 14:26:25.011INFO 18304 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 此刻时间 2022-10-25T14:26:25.011可以看到,确实是每隔 1 秒执行一次 printTime() 这个定时任务 。
@Scheduled 的另外两个属性@Scheduled 注解除了 cron 这个属性外,还有 fixedRate 属性和 fixedDelay 属性,同理,就是固定频率触发定时任务和固定延迟触发定时任务
fixedRate@Slf4j@Component@EnableSchedulingpublic class TaskDemo {/*** 当前任务执行到下一个任务开始的时间(固定频率开始执行一个任务,每5秒执行),都是单线程处理的**/@Scheduled(fixedRate = 5000)public void printTime1() throws InterruptedException {log.info("任务开始------- {}", LocalDateTime.now());Thread.sleep(1000);log.info("任务完成------- {}", LocalDateTime.now());}}控制台输出:
2022-10-25 14:54:04.824INFO 23520 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:54:04.8242022-10-25 14:54:05.833INFO 23520 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务完成------- 2022-10-25T14:54:05.8332022-10-25 14:54:09.834INFO 23520 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:54:09.8342022-10-25 14:54:10.843INFO 23520 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务完成------- 2022-10-25T14:54:10.843当然,如果任务的处理逻辑超过了固定的频率时间,比如我们修改下 Thread.sleep(1000) ,模拟成 6 秒,即 Thread.sleep(6000),那么输出如下:
2022-10-25 14:57:04.212INFO 9324 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:57:04.2122022-10-25 14:57:10.227INFO 9324 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务完成------- 2022-10-25T14:57:10.2272022-10-25 14:57:10.227INFO 9324 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:57:10.2272022-10-25 14:57:16.241INFO 9324 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务完成------- 2022-10-25T14:57:16.2412022-10-25 14:57:16.242INFO 9324 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:57:16.2422022-10-25 14:57:22.243INFO 9324 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务完成------- 2022-10-25T14:57:22.2432022-10-25 14:57:22.243INFO 9324 --- [scheduling-1] cn.god23bin.demo.task.TaskDemo: 任务开始------- 2022-10-25T14:57:22.243

经验总结扩展阅读