1 自定義Enable**注解,2 簡單了解開門狗機(jī)制及源碼

我用的版本jkd17,如果是jkd8或者11的在模仿做的時候可以去看下對應(yīng)注解的源碼差不多就可以直接復(fù)制粘貼用。
1 自定義Enable**注解
很多時候我們需要自己封裝一個starter來進(jìn)行出來,如果不在啟動類上添加對應(yīng)的@enable**注解,對應(yīng)的配置類以及bean是不會被創(chuàng)建的
controller代碼
自定義Enable**注解
先來說說@Import這個注解,這個注解是用來在加載一個configuration配置類的bean的時候加上@Import注解 會導(dǎo)入后面這個配置xxxSelector這種的bean,如果不添加spring容器是不會在加載上述configuration配置類再去額外的去加載別的configuration中的bean了
BookSelector

selectImports方法作用如下


個人感覺總的來說就是返回對應(yīng)完整包名下的沒有添加注解的configuration的配置類,也可以說是編程式配置類。
BookConfg
Book
測試
沒有開啟注解

編輯
結(jié)果

開啟注解

編輯
結(jié)果

編輯切換為居中
這個可以用來自己學(xué)著封裝一個starter,并且可以防止springboot啟動的時候少掃描不必要的bean,我前面的文章有寫如何自定義一個starter,嘻嘻
自定義starter,注解,實(shí)現(xiàn)分布式鎖? ---某乎的文章名字(也是我這個菜鳥寫的哈哈)
2 簡單了解開門狗機(jī)制及源碼
不耐心的或者覺得寫的太亂的可以直接往下翻總結(jié)
redission中分布式鎖的看門狗機(jī)制
依賴版本
個人來說就是一個key被鎖住即將釋放的時候,如果在當(dāng)前線程還沒執(zhí)行完任務(wù)的時候,有新的線程進(jìn)來爭搶,會導(dǎo)致鎖應(yīng)該給誰的問題,這個時候官方為我們提供看門狗的機(jī)制,會自動增加鎖的時間,默認(rèn)的是30秒。不信的話,那個鎖住的key的ttl為30秒,自己可以下去試驗(yàn)一下。
調(diào)用方法trylock

調(diào)用方法的時候默認(rèn)給的釋放時間是-1,這個比較特殊,請記住
這是核心判斷鎖key的ttl方法,推薦自己單獨(dú)看上鎖源碼和操作,lua腳本放下面

再往下看核心代碼


注意,這個mapConcurrentMap(自己去查是否線程安全,別一天到晚等著)存放對應(yīng)的key和那幾種service,后續(xù)的自己可以去看看,關(guān)于源碼我下午看著看著記得有點(diǎn)亂。


總結(jié)
redission中的會實(shí)現(xiàn)一個看門狗的機(jī)制,并且在關(guān)鍵上鎖方法內(nèi)里面會有選擇是主從節(jié)點(diǎn)返回一個resouce還是集群節(jié)點(diǎn)返回一個resource,這個應(yīng)該涉及到主從key問題一致和集群key一致(本人猜想,主要是分布式鎖涉及到了訂閱發(fā)布操作)。還有實(shí)現(xiàn)的方法是一段lua腳本,其中對應(yīng)的是實(shí)現(xiàn)的service有這幾種。

看門狗續(xù)費(fèi)的實(shí)現(xiàn),其實(shí)是啟動了一個TimerTask(定時任務(wù)),也就是每隔一段時間會有進(jìn)程去更新一下這個key的ttl。還有那個上鎖的key源碼都是設(shè)置為可讀寫的,因?yàn)橐鉀Q對應(yīng)的看門狗續(xù)費(fèi)問題
如果分布式鎖的看門狗續(xù)費(fèi)失效的很多時候的切入點(diǎn)去看一下調(diào)用方法里的leaseTime是否是-1這個很關(guān)鍵?。?!
也是scheduleExpirationRenewal方法是否正常調(diào)用
EVAL這個是執(zhí)行l(wèi)ua腳本的關(guān)鍵
如果覺得寫的很亂沒有邏輯/可以改進(jìn)的地方可直接私信我說一下問題,我會采取改進(jìn)的,我是鱸魚,努力分享自己所學(xué)。