前言:之前今日開講項目的時候,用到了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,爲什麼別人想的比我周全?