紙上得來終覺淺,絕知此事要躬行——Spring boot任務調度

前言:之前今日開講項目的時候,用到了Quartz進行任務調度。後來做一個電商項目的時候,還用到了Quartz任務調度。 覺得挺簡單的,a peace of cake.  忽略了總結,當時閉着眼睛都能捉麻雀,現在睜着眼睛一片黑!


一、我最開始的想法

前提條件:對Spring boot不熟悉,對於框架代碼結構也不熟悉(最近都用NetBeans,有些jar包,用到了就可以馬上自動添加依賴啊,現在不行了) 

我的想法是:先看看Spring boot有什麼,又着重看了我需要用到的任務調度、郵件發送的部分。然後再去實施寫代碼,事實上,官網寫得確實很明白,最開始的任務調度也很順利

但是,問題就出在了異常報警。  我的思路是用AOP監控每一個任務的執行情況,一旦有異常發生,就發送報警郵件。但是,在織入具體註解的時候,AOP總是切不進去(欺負生人)後來就直接用了正則表達式,但是。。。。。。執手相看淚眼,竟無語凝噎!


問題:

之前一直的習慣可能是做這種非具體業務類實現的時候,第一個工程總是做測試和廢棄的,所以在代碼規範上就忽略了。 這樣做不對,畫個大大的×!

效率低下的原因是:1,沒有分清楚輕重緩急;2,我不知道目前都有哪些API(爲啥我找到的發送郵件API是那樣的涅)


二、實踐過程

1,根據文檔說,Spring boot有兩種任務調度的方式,第一種直接使用註解@Scheduled,第二種是通過Quartz。   因爲好奇,就折騰Quartz(忽略了Spring做集成後,操作變得簡單了),浪費了不少的時間。

2,當發生異常的時候發送郵件提醒就可以了,然而,我剛開始在嘗試將異常任務的詳細信息保存到數據庫和日誌(可是我明明可以把這些東西發郵件噠,無語了)

3,同事幫忙弄好了工程,然後弄了兩個TODO方法,我再把代碼寫完了 

4,分佈式鎖的問題,SetNX。  PS:看這個命令的時候,把redis所有的命令溜了一圈


待續。。。   等把這塊兒內容做完了,再補全,先把這個事兒記錄下來,思維方式嚴重有bug,到時候得好好規整規整!


2017.11.20續

最主要想說的,其實是在分佈式鎖這塊內容的思維方式上,我最開始的邏輯:

1,先去redis裏面取,取不到的話,就相當於沒有執行任務調度,加鎖—執行,取到值(被加鎖),不執行當前的任務調度

2,執行錯誤,發送郵件


後來經過同事提醒,發現有個大bug:  當我取到值的時候,還有可能是上次的任務調度沒執行結束; 還有可能是我的redis失效時間沒弄對;還有可能,是我忘了執行結束後,釋放鎖。   很不小心的,我全中啦,無語凝噎!


經過同事的指點,然後我自己就開始不明白我爲什麼要先去處理redis裏面取值等邏輯,然後加鎖,因爲這樣勢必會讓多個線程同時進入執行一段相同代碼,而這是不必要的。 所以我後來就改掉了,程序一開始就通過setNX去拿鎖,拿到鎖的,接着執行後續的代碼!


三、思考和總結

1,爲什麼我會繞這麼大個圈去解決問題?

2,爲什麼別人想的比我周全?



發佈了306 篇原創文章 · 獲贊 230 · 訪問量 57萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章