• Cron 表达式详解及最新版本使用


    前言

    Spring最新更新了船新版本5.3.22。
    本篇主要简介Corn表达式,接下来让我们一起康康Corn在5.3.22版本有什么不一样的变化吧

    在这里插入图片描述

    Cron 表达式

    @Scheduled(cron = "0/1 * * * * ? ")
    
    • 1

    以上表达式代表什么呢

    正确的cron 表达式,例如 * * * * ,由六个以空格分隔的时间和日期字段组成,每个字段都有自己的有效值范围:

    ┌────────────── 秒 (0-59)
    │ ┌────────────── 分钟 (0 - 59)
    │ │ ┌────── ──────── 小时 (0 - 23)
    │ │ ┌────────────── 一个月中的某天 (1 - 31)
    │ │ │ │ ┌────── ──────── 月 (1 - 12) (或 JAN-DEC)
    │ │ │ │ │ ┌───────────── 星期几 (0 - 7)
    │ │ │ │ │ │ (0 或 7 是星期日,或 MON-SUN)
    │ │ │ │ │ │


    注:最新的版本只支持6位表达式,不支持7位带年

    源码如下CronExpression:

    public static CronExpression parse(String expression) {
    	Assert.hasLength(expression, "Expression string must not be empty");
    
    	expression = resolveMacros(expression);
    
    	String[] fields = StringUtils.tokenizeToStringArray(expression, " ");
    	if (fields.length != 6) {
    		throw new IllegalArgumentException(String.format(
    				"Cron expression must consist of 6 fields (found %d in \"%s\")", fields.length, expression));
    	}
    	try {
    		CronField seconds = CronField.parseSeconds(fields[0]);
    		CronField minutes = CronField.parseMinutes(fields[1]);
    		CronField hours = CronField.parseHours(fields[2]);
    		CronField daysOfMonth = CronField.parseDaysOfMonth(fields[3]);
    		CronField months = CronField.parseMonth(fields[4]);
    		CronField daysOfWeek = CronField.parseDaysOfWeek(fields[5]);
    
    		return new CronExpression(seconds, minutes, hours, daysOfMonth, months, daysOfWeek, expression);
    	}
    	catch (IllegalArgumentException ex) {
    		String msg = ex.getMessage() + " in cron expression \"" + expression + "\"";
    		throw new IllegalArgumentException(msg, ex);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    如果不是6位会抛出以下异常:

    Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method ‘eat’: Cron expression must consist of 6 fields

    Corn规则

    *表示“first-last”,即每时每刻都会触发。
    ?表示月份或星期几字段,可以使用问号?代替星号。

    ,表示列出枚举值。例如:在Minutes域使用13,14,则意味着在13和14分每分钟触发一次

    -表示范围。例如在Minutes域使用10-14,表示从10分到14分钟每分钟触发一次。

    /表示起始时间开始触发,然后每隔固定时间触发一次。

    L表示day-of-month 和 day-of-week 字段可以包含一个L字符,其含义不同

    ①在 day-of-month 字段中,L代表该月的最后一天。如果后跟一个负偏移量(即L-n),则表示n该月的倒数第二天。

    ②在 day-of-week 字段中,L代表一周的最后一天。如果以数字或三字母名称 ( dLor DDDL)
    为前缀,则表示该月中一周的最后一天 ( d orDDD ) 。

    nw表示day-of-month 字段可以是nW,表示离该月最近的工作日n。如果n落在星期六,这将产生它之前的星期五。如果n是星期天,这会产生之后的星期一,如果n是1并且落在星期六,也会发生这种情况(即:1W代表该月的第一个工作日)。

    LW表示 如果 day-of-month 字段为LW,则表示该月的最后一个工作日。

    #表示 day-of-week 字段可以是d#n(or DDD#n),它代表月中的n星期几d (orDDD ) 。

    Corn示例

    cron 表达式意义

    0 0 * * * *

    每天每个小时的开始

    */10 * * * * *

    每十秒

    0 0 8-10 * * *

    每天 8 点、9 点和 10 点

    0 0 6,19 * * *

    每天早上 6:00 和晚上 7:00

    0 0/30 8-10 * * *

    每天 8:00、8:30、9:00、9:30、10:00 和 10:30

    0 0 9-17 * * MON-FRI

    工作日朝九晚五

    0 0 0 25 DEC ?

    每个圣诞节的午夜

    0 0 0 L * *

    每月最后一天的午夜

    0 0 0 L-3 * *

    每月倒数第三天午夜

    0 0 0 * * 5L

    每月最后一个星期五午夜

    0 0 0 * * THUL

    每月最后一个星期四的午夜

    0 0 0 1W * *

    每月第一个工作日的午夜

    0 0 0 LW * *

    每月最后一个工作日的午夜

    0 0 0 ? * 5#2

    每月第二个星期五午夜

    0 0 0 ? * MON#1

    每月第一个星期一的午夜

    宏定义

    宏定义是高级语言编译器提供的常用语法,其目的是利用某一标识符标识某个文本字符串。

    诸如0 0 * * * *人类难以解析的表达式,因此在出现错误时难以修复。为了提高可读性,Spring 支持以下表示常用序列的宏。您可以使用这些宏来代替六位数的值,列如:@Scheduled(cron = “@hourly”).

    意义

    @yearly(或@annually

    一年一次 ( 0 0 0 1 1 *)

    @monthly

    每月一次 ( 0 0 0 1 * *)

    @weekly

    每周一次 ( 0 0 0 * * 0)

    @daily(或@midnight

    一天一次 ( 0 0 0 * * *),或

    @hourly

    每小时一次, ( 0 0 * * * *)

    官网参考:
    https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#scheduling-cron-expression
    奇文共观赏,疑义相与析。

  • 相关阅读:
    信奥中的数学:斐波那契数列
    Java中13 种锁的实现方式有哪些?
    数据结构与算法 -- 递归
    java 基于微信小程序的饭店外卖点餐系统 uniapp小程序
    spring boot中的标注@Component、@Service等
    当所有行业都在数字化转型时,企咨行业如何快速“破局”
    [附源码]计算机毕业设计springboot疫情防控平台
    Spark RDD 转换算子
    第二章第二节:字符串 索引和切片
    基于教与学优化的BP神经网络(分类应用) - 附代码
  • 原文地址:https://blog.csdn.net/qq_35764295/article/details/126009934