说起 cron 表达式大家一定不陌生,我们常用来作为定时任务执行策略规则。 在 Spring Boot 框架中 cron 表达式主要配合 @Scheduled 注解在应用程序中使用。 在 Spring Boot 2.4 (既 Spring 5.3)以后,引入了 CronExpression

表达式处理器来替代原有的 CronSequenceGenerator。

为什么要替代原有的 CronSequenceGenerator ? 此处理器是基于 java.util.Calendar局限性比较大,无法完成last day of month 语义。

  • 例如利用CronExpression 计算表达式下次执行时间
  LocalDateTime now = LocalDateTime.now();
System.out.println("当前运行时间: " + now); // 每小时执行一次
CronExpression expression1 = CronExpression.parse("0 0 0/1 * * *");
LocalDateTime nextTime = expression1.next(now);
System.out.println("每小时执行一次 -> 下次执行时间: " + nextTime); // 每小时第十分执行一次
CronExpression expression2 = CronExpression.parse("0 10 0/1 * * *");
LocalDateTime nextTime2 = expression2.next(now);
System.out.println("每小时第十分执行 -> 下次执行时间: " + nextTime2);
  • 执行结果
当前运行时间: 2020-11-14T23:04:46.302739
每小时执行一次 -> 下次执行时间: 2020-11-15T00:00
每小时第十分执行 -> 下次执行时间: 2020-11-14T23:10

新增常用表达式通用宏

对于非开发人员来说 cron 表达式并不容易理解,所以很难在出现错误的时候进行修复。比如笔者会把 cron 表达式 在在线网站 模拟运行一下,确认执行过程方便排查问题。

为了提高可读性,Spring Boot 现在支持以下代表常用表达式的宏。可以使用这些宏而不是六位的表达式,因此:

@Scheduled(cron = "@hourly")。

相当于

@Scheduled(cron = "0 0 * * * *")

其他常用宏命令

宏 cron 表达式 含义
@yearly 0 0 0 1 1 * 每年执行一次
@monthly 0 0 0 1 * * 每月执行一次
@weekly 0 0 0 * * 0 每周执行一次
@daily 或@annually 0 0 0 * * * 每天执行一次
@hourly 0 0 * * * * 每小时执行一次

增强原有表达式 最后几天

       每周的第几天
|
∨
* * * * * *
^
|
每月的第几天

如上其中的 每月的第几天、每周的第几天 支持 最后几天 (L) 的语义

例如:

0 0 0 L * *   每月最后一天的零时

0 0 0 L-3 * *   每月最后第三天的零时  (L-d 格式)

0 0 0 * * 5L    每月最后的星期五零时  (dL 格式)

0 0 0 * * FRIL  每月最后的星期五零时  ( (星期一星期天的英文缩写)L 格式)

增强原有表达式 工作日

 * * * * * *
^
|
每月的第几天

如上其中的 每月的第几天 支持 工作日 (W)的语义

例如:

0 0 0 1W * * 每月的第一个工作日零时
0 0 0 LW * * 每月的最后一个工作日零时

增强原有表达式 几周的星期几

       每周的第几天
|
∨
* * * * * *

如上其中的 每周的第几天 支持 每月第几周的第几天语义

例如

0 0 0 ? * 5#2     每月第二周的星期五零时

0 0 0 ? * MON#1    每月周一的星期一零时

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

Spring Boot 2.4 新特性,全新的Cron表达式处理机制的更多相关文章

  1. Spring Boot 2(一):Spring Boot 2.0新特性

    Spring Boot 2(一):Spring Boot 2.0新特性 Spring Boot依赖于Spring,而Spring Cloud又依赖于Spring Boot,因此Spring Boot2 ...

  2. Spring Boot 2.0 新特性和发展方向

    以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...

  3. 【2.0新特性】Spring Boot 2.0新特性

    以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...

  4. Spring Boot实践——Spring Boot 2.0 新特性和发展方向

    出自:https://mp.weixin.qq.com/s/EWmuzsgHueHcSB0WH-3AQw 以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Jav ...

  5. Spring Boot 2.0 新特性

    这是一篇总结文章,主要收集 Spring Boot 2.0 相对于 Spring Boot 1.x 的新特性,本章节并不提供实践性质的源代码.在 Spring Boot 系列文章中会持续退出实践章节. ...

  6. Spring Boot 2.3 新特性优雅停机详解

    什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") p ...

  7. 原创 Spring Boot 2.3 新特性分层JAR

    背景 在我们实际生产容器化部署过程中,往往会遇到 Docker 镜像很大,部署发布很慢的情况 影响 docker 镜像大小的因素,主要有以下三个方面: 基础镜像的大小 .尽量选择 aphine 作为基 ...

  8. 『Spring Boot 2.4新特性』减少95%内存占用

    节省 95%的内存占用,减少 80%的启动耗时. GraalVM 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java 框架 Quarkus 默认支持 G ...

  9. 「Spring Boot 2.4 新特性」启动耗时详细监控

    背景 Spring Boot 项目随着项目开发过程中引入中间件数量的增加,启动耗时 逐渐增加. 笔者在 <Spring Boot 2.4.0 正式 GA,全面拥抱云原生>文章评论下发现了 ...

随机推荐

  1. Java基础篇(04):日期与时间API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.时间和日期 在系统开发中,日期与时间作为重要的业务因素,起到十分关键的作用,例如同一个时间节点下的数据生成,基于时间范围的各种数据统计和分 ...

  2. idea配置阿里maven镜像

    首先打开IDEA安装路径下的:"\plugins\maven\lib\maven3\conf\settings.xml" 找到里面的mirror配置,进行修改如下: <mir ...

  3. 下载com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

    看别人都说在repo.maven.com下载,没想到竟然要登录 索性我直接在国内阿里云的镜像仓库下载好了,速度又快又方便 搜索aspectj 下载地址:https://maven.aliyun.com ...

  4. Vue框架:vue-cookies组件

    目录 一.vue-cookies简介 二.vue-cookies安装与配置 三.vue-cookies的使用 一.vue-cookies简介 vue-cookies组件是vue框架用来操作浏览器coo ...

  5. 调度场算法&&中缀表达式=>后缀表达式

    #include<stdio.h> #include<string.h> int main(void){ char ch,stro[1001],stack[1001]; int ...

  6. 《C++ Primer》笔记 第4章 表达式

    C++的表达式要不然是右值(right-value or read-value),要不然就是左值(left-value or location-value). 当一个对象被用作右值的时候,用的是对象的 ...

  7. 快速电路仿真器(FastSPICE)中的高性能矩阵向量运算实现

    今年10-11月份参加了EDA2020(第二届)集成电路EDA设计精英挑战赛,通过了初赛,并参加了总决赛,最后拿了一个三等奖,虽然成绩不是很好,但是想把自己做的分享一下,我所做的题目是概伦电子出的F题 ...

  8. 《吃透MQ系列》核心基础全在这里了

    这是<吃透XXX>技术系列的开篇,这个系列的思路是:先找到每个技术栈最本质的东西,然后以此为出发点,逐渐延伸出其他核心知识.所以,整个系列侧重于思考力的训练,不仅仅是讲清楚 What,而是 ...

  9. SnowNLP——获取关键词(keywords(1))

    一.SnowNLP的获取文本关键词 前面介绍了SnowNLP的获取关键词的方法,这里再重现一下 1 from snownlp import SnowNLP 2 # 提取文本关键词,总结3个关键词 3 ...

  10. calcite 概念和架构

    1. 前言 Flink使用Calcite构造SQL引擎,那么他们 是怎么合作的? drill, hive,storm 和其他的一干apache 大数据引擎也用calcite , 那么对于同一个sql  ...