當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Schedule定时关单快速入门
生活随笔
收集整理的這篇文章主要介紹了
Spring Schedule定时关单快速入门
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先講一下Spring Schedule的一個(gè)介紹,然后是Spring Schedule的一個(gè)快速入門,這里面我們會(huì)列一個(gè)表格,然后領(lǐng)著大家來看一下,然后是Spring Schedule Cron的生成器,會(huì)教大家怎么來使用他
然后我們還會(huì)講一下Spring Schedule的一個(gè)配置,還有MYSQL的行鎖和表鎖,那我們現(xiàn)在來介紹一下Spring Schedule,一句話理解,用作作業(yè)調(diào)度,如定時(shí)任務(wù),那JDK原生的呢,提供Timer,Task,這些類來完成定時(shí)任務(wù),那開源框架還有Quarz,但是我們主要是使用Spring Schedule框架,那我們來看一下Spring Schedule框架的快速入門
那么Spring Schedule Cron表達(dá)式呢,其實(shí)和Quartz的表達(dá)式是一樣的,我們一起來看一下,首先第一個(gè)是秒,第二位是分,第三位是小時(shí),第四位是日,第五位是月,第六位是周,第七位是年,年是可選的,那對于年來說,實(shí)際生產(chǎn)環(huán)境并不是太多,所以我們主要是把前六位弄明白,那如果前六位明白的話,那第七位的年也很輕松理解的我們接著來看,現(xiàn)在對第五六七位的介紹,那我們看一下,關(guān)于這些字段允許的值,和允許的特殊字符
首先秒允許的值是0到59,運(yùn)行的特殊字符是逗號,橫線,星號和斜杠,那分和小時(shí)允許的特殊符號一樣的,只不過小時(shí)是從0點(diǎn)到23點(diǎn),月內(nèi)日期是1到31,然后月大家看一下,1到12,或者英文,周內(nèi)日期是1到7,年一般都留空,右側(cè)的特殊符號第一次接觸的時(shí)候也不用慌,我們現(xiàn)在來挨個(gè)解釋一下,我們一起來看一下
首先是星號,代表匹配所有的值,那星號用處是最多的,第二個(gè)問號,只有在星期域和日期域中使用,他被用來指定非明確的值,那一會(huì)在我們實(shí)際項(xiàng)目中,使用的Cron表達(dá)式也會(huì)用到問號,橫線是指定一個(gè)范圍,如10-12,代表的是10點(diǎn),11點(diǎn),12點(diǎn),前提是我們把10-12設(shè)置在小時(shí)域,逗號就是一個(gè)可選值,如星期一逗號,星期三逗號,星期五逗號,斜杠是比較重要的,這里表示指定的增量,如0/15,如果在秒域意思是,每分鐘的0秒,15秒,30秒,45秒,那5/15在分鐘域呢,所表示每小時(shí)的5分鐘,20分鐘,35分鐘和50分鐘,也就是說從第5分鐘開始,增量15,然后就是20,再增量15就是35,再增量15就是50,然后我們經(jīng)常能看到的寫法,就是*/10,其實(shí)呢,*/10和0/10,是一樣的,也就是初始值都是從0開始的,那對于星號問號,斜杠,我們實(shí)際工作當(dāng)中,使用的是最多的,下面說一下L,表示day-of-month,和day-of-week域,但是這兩個(gè)字段中的意思不同,例如day-of-month呢,所表示這個(gè)月的最后一天,那后邊有一些例子,L我們實(shí)際用的不是太多,有興趣的可以去查一下,然后我們繼續(xù)來看
大家看到這么多表不要慌,一會(huì)把表達(dá)式的生成器一起來理解一下,W是只允許在日期域出現(xiàn)的,這個(gè)字符是指定日期的,最近工作日,W相對復(fù)雜一些,可以仔細(xì)看一下,然后我們看一下LW,L和W是可以在日期中聯(lián)合使用的,LW表示這個(gè)月最后一周的工作日,井號是只允許在星期域中出現(xiàn)的,這個(gè)字符用于指定本月的某某天,而6#3表示本月第三周的星期五,那6就表示星期五,3表示第三周,畢竟Cron表達(dá)式是老外發(fā)明的,那星期日就作為一周的第一天,星期六作為一周的第七天,那第六天就是一周的星期五,所以4#5就代表第五周的星期三,然后C是允許在星期域和日期域中出現(xiàn),我們這里面就不詳細(xì)的介紹了,一會(huì)我們可以做一個(gè)實(shí)驗(yàn)
常用Cron表達(dá)式介紹,我們已經(jīng)把年給省掉了,*/1和0/1是一樣的,它是在分鐘域的,后面的星是通配,最后的問號是不確定的,所以我們只看前兩個(gè),他就代表每一分鐘,請仔細(xì)看括號里面的內(nèi)容,例如我從這一分鐘第30秒啟動(dòng)我們的項(xiàng)目,并不是說,他會(huì)在1分30秒的時(shí)候,兩分30秒的時(shí)候,3分30秒的時(shí)候,來執(zhí)行,它會(huì)在啟動(dòng)30秒之后,等待30秒,等待到1分鐘的整數(shù)倍的時(shí)候執(zhí)行,那下面的小時(shí)也是同理,例如 0 0 */6代表每6個(gè)小時(shí),也就是每6個(gè)小時(shí)的整數(shù)倍,來執(zhí)行,那這里我拋出一個(gè)問題,每6個(gè)小時(shí)的整數(shù)倍,那么又會(huì)在哪個(gè)時(shí)間點(diǎn)執(zhí)行呢,然后0 0 */1這個(gè)比較簡單,每一個(gè)小時(shí)的整數(shù)倍都會(huì)執(zhí)行
然后說一下Spring Schedule Cron的生成器,那這個(gè)生成器我們實(shí)際工作當(dāng)中呢,使用它可以提高我們的效率,我們在搜索引擎搜索cron生成器,現(xiàn)在我們演示生成器生成的方法,首先我們先搜索cron生成器,這里邊有很多,我們剛才說的 0 0 */6 * * ?,*/6和0/6是一樣的,我們解析,反解析到UI,這個(gè)時(shí)候要說一下,這個(gè)網(wǎng)站有時(shí)候有一些bug,這里變成了0-6http://cron.qqe2.com/
我們再*/6反解析到UI
所以我們在使用生成器的時(shí)候要注意,如果有bug,自己去改一下,那這里面就可以看到,最近5次的運(yùn)行時(shí)間,6點(diǎn),12點(diǎn),18點(diǎn),0點(diǎn),6點(diǎn),因?yàn)?/6就是0/6,0就代表從0點(diǎn)開始,然后沒到6小時(shí)的整數(shù)倍,開始執(zhí)行,所以秒,分鐘,小時(shí)的域呢,是*/6,后面的年呢,省略沒有填的,這樣我們就很簡單的通過cron表達(dá)式,反解析出來,他最近的一個(gè)schedule運(yùn)行時(shí)間是什么樣子,然后上邊我們可以看一下,這里允許的通配符,上面也是有的,然后我們可以在上面進(jìn)行一個(gè)組裝,組裝也可以組成下面的表達(dá)式,根據(jù)實(shí)際的工作和業(yè)務(wù)場景呢,來這里面使用cron表達(dá)式,緊接著我們要學(xué)習(xí)Spring Schedule的一個(gè)配置,首先我們要在Spring配置文件當(dāng)中,增加task,如果在IDE里邊,我們可以通過快捷鍵,來吧xml的namespace,還有schema,自動(dòng)的加上,那具體加在那個(gè)位置呢,我們實(shí)戰(zhàn)當(dāng)中也會(huì)來講的
繼續(xù)Spring Schedule的一個(gè)配置,那么我們配置完成之后,我們要寫一個(gè)Spring Schedule的類,這個(gè)類上面呢,我們要加一個(gè)注解,@Component,我們通過這個(gè)注解把這個(gè)類注冊為Spring容器當(dāng)中的一員,然后繼續(xù),那在我們要執(zhí)行的方法上邊呢,就可以加@Schedule的這么一個(gè)注解,然后我們在注解里面呢,把這個(gè)表達(dá)式寫上,那這個(gè)方法我們就可以認(rèn)為是一個(gè)定時(shí)任務(wù)方法了,例如我們看一下,我們在方法上增加@Scheduled(cron="0 */1 * * * ?"),這個(gè)就代表每一分鐘執(zhí)行一次
既然是關(guān)閉訂單呢,我們這里就要牽扯到,MYSQL的行鎖和表鎖,我們會(huì)使用select * from .. for update,這種方式,其實(shí)for update是一種悲觀鎖,那后續(xù)演進(jìn)我們也會(huì)演進(jìn)成樂觀鎖的,大家可以從易到難,樂觀鎖在表中增加一個(gè)字段,然后它是一個(gè)version,version我們可以使用時(shí)間戳毫秒數(shù),然后來進(jìn)行一個(gè)判斷,再?zèng)Q定這個(gè)值是否要更新,是否要回滾,那么for update呢,是一個(gè)悲觀鎖,但是雖說簡單,還是有很多要注意的點(diǎn),我們來看一下,首先我們要使用Innodb引擎,那在我們項(xiàng)目當(dāng)中,都是使用的innodb引擎,然后繼續(xù)看,for update在明確主鍵的時(shí)候,會(huì)產(chǎn)生行鎖,如果主鍵不明確的話,會(huì)產(chǎn)生表鎖,也是一個(gè)ROW-Level Lock,一個(gè)Table-Level的Lock
例如我們mmall_product表,有id和name,id是產(chǎn)品的主鍵,name是產(chǎn)品的名稱,首先是明確指定主鍵,并且有結(jié)果集的,那就是行鎖select * from mmall_product where id = '66' for update;我們主要看where id,id是明確的主鍵,并且我們產(chǎn)品表里有這個(gè)產(chǎn)品,也就代表著有結(jié)果集,那么他會(huì)產(chǎn)生一個(gè)行鎖
明確指定主鍵,并且沒有結(jié)果集,我們查一個(gè)id是-100的,id也是主鍵,但是呢沒有結(jié)果集,不會(huì)上鎖,也就是無lock,select * from mmall_product where id = -100 for update;
無主鍵看一下select * from mmall_product where name = 'phone' for update;name并不是主鍵,所以這個(gè)SQL語句會(huì)產(chǎn)生鎖表,會(huì)把整個(gè)表鎖住,所以我們在使用for update悲觀鎖的時(shí)候,這里一定是要注意的,如果一個(gè)不慎就會(huì)造成線上的故障
那主鍵不明確呢select * from mmall_product where id <> 66 for update;其實(shí)就是不等于,代表主鍵不明確,不等于66的主鍵,非常多,所以這個(gè)鎖也會(huì)變成表鎖,鎖住整個(gè)表,那這個(gè)是主鍵不明確
然后再看一下,如果用id like,那主鍵也是不明確,所以還會(huì)變成表鎖select * from mmall_product where id like '66' for update;
?
總結(jié)
以上是生活随笔為你收集整理的Spring Schedule定时关单快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Session源码解析
- 下一篇: Spring Schedule配置及初始