免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

spring cron表達(dá)式源碼分析

在springboot中,我們一般是通過如下的做法添加一個(gè)定時(shí)任務(wù)

spring cron表達(dá)式源碼分析

文章插圖
上面的new CronTrigger("0 * * * * *")中的參數(shù)0 * * * * *就是cron表達(dá)式了 。
這里主要是對cron表達(dá)式的源碼進(jìn)行分析,其他內(nèi)容不再展開了 。
這能看到會創(chuàng)建一個(gè)CronTrigger對象,這個(gè)對象它主要就是用來包裝解析后的cron表達(dá)式,獲取任務(wù)下次執(zhí)行的時(shí)間 。
spring cron表達(dá)式源碼分析

文章插圖
在CronTrigger構(gòu)造方法中會調(diào)用到this.expression = CronExpression.parse(expression);將我們傳入的cron字符串解析成為CronExpression對象 。
CronExpression主要有一個(gè)next方法,它會根據(jù)當(dāng)前cron表達(dá)式解析出來的對象,以及傳入的時(shí)間,返回一個(gè)時(shí)間值,也就是下次任務(wù)執(zhí)行的時(shí)間 。
spring cron表達(dá)式源碼分析

文章插圖
這里的入?yún)⑿枰獙?shí)現(xiàn)Temporal接口 。這是在JDK8引入的一套全新的時(shí)間、日期 。
能引入新的,至少說明之前的Date等等之類的時(shí)間處理是不能滿足各方面需要的 。
下面看看它的主要實(shí)現(xiàn)
spring cron表達(dá)式源碼分析

文章插圖
這里我們一般常用的可能就是Instant,LocalDateTime,ZonedDateTime了 。
從上面就可以看到cron表達(dá)式的處理,主要是分為兩步:1、將cron表達(dá)式字符串解析為CronExpression對象;2、根據(jù)傳入的時(shí)間計(jì)算下次任務(wù)的執(zhí)行時(shí)間 。
在分析源碼之前,我們簡單看幾個(gè)java中的類
  1. ValueRange主要用來表示時(shí)間、日期字段的有效范圍 。當(dāng)然它也可以不用來表示時(shí)間、日期 。下面我們簡單看下它的使用 。
    它主要有4個(gè)字段,4個(gè)屬性值從上到下是不小于的關(guān)系 。
private final long minSmallest;   //最小的最小值private final long minLargest;    //較大的最小值private final long maxSmallest;   //較小的最大值private final long maxLargest;    //最大的最大值//定義1個(gè)(1-10)的范圍指定minSmallest和minLargest都是1,maxSmallest和maxLargest都是10ValueRange valueRange=ValueRange.of(1,10);//判斷5是不是在上面定義的minSmallest和maxLargest(1-10)的范圍內(nèi),在的話返回trueboolean validValue = valueRange.isValidValue(5);System.out.println(validValue);
  1. ChronoField是一個(gè)枚舉類,就是用來表示時(shí)間、日期的字段 。
    下面我們簡單看它的幾個(gè)實(shí)例
//用納秒來表示表,1秒==1000000000納秒,所以它的范圍是0-999999999NANO_OF_SECOND("NanoOfSecond", NANOS, SECONDS, ValueRange.of(0, 999_999_999)),//用納秒來表示一天,1天==86400秒,再轉(zhuǎn)成納秒就是86400L*1000000000NANO_OF_DAY("NanoOfDay", NANOS, DAYS, ValueRange.of(0, 86400L * 1000_000_000L - 1)),......其他基本類似,就不繼續(xù)說了
  1. ChronoUnit也是一個(gè)枚舉類,表示一個(gè)時(shí)間單元 。有一個(gè)addTo方法表示給時(shí)間加上一個(gè)對應(yīng)的時(shí)間單元 。
//下面的代碼就是給當(dāng)前時(shí)間加上1天ZonedDateTime now = ZonedDateTime.now();ZonedDateTime zonedDateTime = ChronoUnit.DAYS.addTo(now, 1);我們先看第一步:
1、將cron表達(dá)式字符串解析為CronExpression對象我們傳入的表達(dá)式用空格分成6個(gè)部分,每個(gè)部分代表的含義如下:
spring cron表達(dá)式源碼分析

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀