當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Boot定时任务-cron表达式
生活随笔
收集整理的這篇文章主要介紹了
Spring Boot定时任务-cron表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
其實cron表達式呢,其實就是一個基于字符串的,基于時間的一個定義格式,那我們就來看一下cron表達式語法的定義,cron表達式它是一個字符串的,并且在字符串當中呢,包含6個域或者7個域,然后每個域表示的含義也不同,我們來看一下他的基本語法,語法上有兩種格式,這個是7個域的格式,這個是6個域的格式,每個域當中表示的是什么呢,從左至右,分別為秒 分鐘,小時,天,月,星期和年,那么第二種語法格式呢,就是比第一個格式少了一個年,然后我們在這個案例當中,用的就是6個域的表現形式,而且這里我推薦大家使用6個域的表現形式,為什么這么說呢,因為cron的表達式,他不僅可以在Schedule的定時器當中,在其他的定時任務技術當中,他也有對cron表達式的一個支持,而有一些定時任務器,他的要求是6個域的表現形式,你給他7個域反而報錯,所以這里我們使用6個域的就夠了,我們看一下每個字段允許的值是什么,第一個位置秒,這個位置允許添加的值就是0到59,表示60秒,然后包含0到59,如果給的值超過了允許值,是什么樣的呢,比如說在我這個案例當中,我把秒改成60,然后我們來運行我們這個程序,觀察控制臺,馬上會得到一個異常@Scheduled(cron="60 * * * * ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}這個異常說的很清楚了Initialization of bean failed; nested exception is java.lang.IllegalStateException: Encountered invalid @Scheduled method 'scheduledMethod': Range exceeds maximum (60): '60' in expression "60 * * * * ?"在我當前的表達式當中,所給出的值已經超出了他的最大范圍,在我這個表達式當中,所以這個值還是不能夠隨便亂填的,所以我們填的就是0到59的一個范圍,那這里我們填一個3,這表示什么含義呢,@Scheduled(cron="3 * * * * ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}這個表示第三秒鐘,秒后面是分鐘,這個*號表示任意的,那就是每分鐘的第三秒,就是每分鐘的第三秒去執行這個方法,不是每隔3秒,注意不是每隔3秒,是每分鐘的第三秒,我們再往下看,分鐘也就是我們的第二個域,分鐘允許填的值也是0到59范圍內的,來表示60分鐘,比如我這里寫一個50@Scheduled(cron="3 50 * * * ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}就是50分第3秒,去執行這個,咱們再往下看,除了有分鐘以外,第三個域,是小時,小時的取值范圍是0到23,那么也就是說,它是采用了24時制的時間,對于小時的表現格式,0就是我們凌晨的12點,然后23就是晚上的11點,比如說,第三個域是小時,我給一個18,這表示什么意思呢,表示6點50分第3秒會觸發這個方法@Scheduled(cron="3 50 18 * * ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}除了小時以后呢,第四個就是我們的天,就是我們的日,他的取值范圍是1到31號,這里有一個地方需要我們注意,比如我們這里寫一個31@Scheduled(cron="3 50 18 31 * ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}其實我們知道的,并不是每一個月份都有31號,比如像2月份,有可能是28,也有可能是29,然后像小月的,比如像4月份,他就到30號,那如果我這個寫了31號,會表示什么含義呢,其實日還要配合著下一個參數,月,我現在這個月給定的是31號,表示任意一月,在任意月當中,如果這個月有31號,那就在這個月的31號6點50分第3秒,來執行這個方法,來觸發這個方法,如果這塊我寫2呢@Scheduled(cron="3 50 18 31 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}很顯然這是不對的,2月份哪有31號,那如果我非要這么寫,會是一個什么樣的結果呢,我們來運行一下這個時候你發現你又得到一個異常了java.lang.IllegalArgumentException: Invalid cron expression "3 50 18 31 2 ?" led to runaway search for next trigger然后這個異常里說什么呢,它是一個無效的cron表達式,因為在這個表達式當中,他永遠都不會被觸發,也就是2月份當中沒有31號的,你給的表達式要我在2月31號去觸發,怎么給你觸發,所以這塊也是有問題的,那么我們在定義天的時候,一定要注意他跟月是有關系的,如果我要這么寫呢@Scheduled(cron="3 50 18 15 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}這就沒有什么問題的,這表示什么呢,2月15號6點50分03秒,來觸發這個方法,這是可以的,然后我們再往下看,現在我們把月說完了,還有一個是星期,星期他的取值范圍是1到7,這里有一個地方需要注意的是,這個1并不是表示星期一,你像美國人,他的每一個星期的起始的日期,都用的星期日,那么他的1就表示星期日,作為一周的開始,然后7則表示星期六,作為一周的結束,這里要給的話要注意,在給定星期的時候呢,還有一個地方需要注意,比如這塊我給一個4@Scheduled(cron="3 50 18 15 2 4")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}這表示什么,這表示的是星期三,那么其實這個時間格式也是會有問題的,什么問題呢,在2月份當中,他的星期四,他并不一定是15號,所以星期和日是有沖突的,所以我們一般來做這個定義的時候,我們一般是舍棄一個,如果把它舍掉就表示2月15號@Scheduled(cron="3 50 18 15 2 ?")如果這個是問號,則表示2月份的每個星期四@Scheduled(cron="3 50 18 ? 2 14")2月份的每個星期四的6點50分03秒,來觸發我這個方法,問號其實就是表示一個占位,你舍棄誰,就用一個問號占位就可以了,日和星期在某種程度上,它是有沖突的,一般都會選擇一個,接下來再看這個年,年我們一般就不去給定了,我們用的是6個域的表現形式,你要給也沒問題,但是要注意的就是,如果我們給年的話,他的取值是1970年到2099年的范圍,那么我們就講了每個取名的一個定義,我們在每個域里面還可以寫特殊符號,比如我們可以寫星號,星號什么意思呢,可以用在所有字段中,表示對應時間的每一個時刻,就是任意一個,例如在*/字段上,就是表示每分鐘,@Scheduled(cron="3 50 18 * 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}就是2月份當中的任意一天,每一天的6點50分03秒,來觸發這個方法,那如果我把50換乘*呢@Scheduled(cron="3 * 18 * 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}那就表示2月份的每一天的6點的每一分鐘的第三秒去觸發這個方法,這個就很好理解,除了有分號以外呢,還有問號,問號我們已經用過了,問號其實就是表示一個單位,他通常指定為無意義的值,相當于占位符,我們再來看減號,就是我們的連字符,減號他表示的就是一個范圍,比如我先在是每分鐘的第三秒,我現在改成10-15@Scheduled(cron="10-15 * 18 * 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}這是什么意思呢,就是每分鐘的10到15秒內,那就是執行5次,應該執行5次,他表示的是一個范圍,還有一個逗號,逗號表示的是什么呢,是一個列表值,比如我把10-15改成逗號@Scheduled(cron="10,15 * 18 * 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}這表示的是2月份的每一天的6點每分鐘的,第10秒鐘和第15秒鐘,去觸發這個方法,然后還有一個斜線,斜線是我們剛才用過的,@Scheduled(cron="0/2 * 18 * 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}0/2表示什么意思呢,表示一個等步長序列,從幾開始,他的增長量是多少,我這個案例,是從第0秒開始,每2秒執行一次,說白了就是間隔兩秒,直接給個2不是間隔兩秒@Scheduled(cron="2 * 18 * 2 ?")
public void scheduledMethod(){System.out.println("定時器被觸發"+new Date());
}這個是每分鐘的第二秒去執行,那其實對于cron的表示式還是比較簡單的,下面還有其他的特殊字符的一個使用,這里就不說了,自己去看一下,我們再來看一個案例,來做一個cron表達式的一個總結,@Scheduled(cron="0 0 1 1 1 ?")在這個Schedule當中加了一個cron表達式,這表示什么意思呢,每年的1月份的1日1點去觸發這個方法,表示的就是每天的1月1號的1點去觸發這個方法@Scheduled(cron="0 0 1 1 1,6 ?")這個表示每天的1月和6月的1號的1點去觸發他@Scheduled(cron="0 0 1 1 1,4,7,10 ?")月份是1月份,4月份,7月份,10月份,其實就是一個季度,表達式就是每個季度的第一個月份的1號的1點去執行一次@Scheduled(cron="0 0 1 1 * ?")每一個月的1號1點去執行一次@Scheduled(cron="0 0 1 * * *")每天的凌晨1點,執行一次,所以這個還是比較簡單
?
總結
以上是生活随笔為你收集整理的Spring Boot定时任务-cron表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot定时任务-@Sch
- 下一篇: Spring Boot定时任务-Quar