Spring Boot 2.4 新特性,全新的Cron表达式处理机制

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

说起 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    每月周一的星期一零时
目录
相关文章
|
7月前
|
人工智能 JSON 安全
Spring Boot实现无感刷新Token机制
本文深入解析在Spring Boot项目中实现JWT无感刷新Token的机制,涵盖双Token策略、Refresh Token安全性及具体示例代码,帮助开发者提升用户体验与系统安全性。
824 4
|
6月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
551 0
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
409 2
|
12月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
2849 17
Spring Boot 两种部署到服务器的方式
|
11月前
|
XML Java Maven
Spring 手动实现Spring底层机制
Spring 第六节 手动实现Spring底层机制 万字详解!
508 31
|
11月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
839 25
|
10月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
424 0
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
2144 15
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
575 8
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
504 4