1. 程式人生 > >Elastic-Job原始碼解析(一)之與Spring完美整合

Elastic-Job原始碼解析(一)之與Spring完美整合

看過小編寫SpringFramework原始碼解析的同學應該對Spring支援自定義標籤還有點印象吧,沒有的話我們回顧下,然後看看Elastic-Job是如何巧妙的利用自定義標籤生成Job任務的吧。請注意這裡用了一個巧妙關鍵字。我們看它如何巧妙的吧。

Spring自定義標籤

在Spring中實現自定義標籤只用繼承NamespaceHandlerSupport類,然後定義自己的BeanDefinitionParse來生成BeanDefinition就可以了。就會被Spring的IOC容器載入到了。
在這裡插入圖片描述

註冊中心解析器

在這裡插入圖片描述

任務解析器

Elastic-Job支援三種類型的任務

型別 解析器 描述
simple SimpleJobBeanDefinitionParser 一般任務
dataflow DataflowJobBeanDefinitionParser 資料流任務
script ScriptJobBeanDefinitionParser 指令碼任務

分別由下面標籤解析器來解析
在這裡插入圖片描述

約束檔案XSD目錄(Spring通過xsd檔案對xml中的標籤進行約束)
在這裡插入圖片描述

Elastic-Job如何巧妙?

注意: 定時任務 = 定時器 + 任務
Elastic Job只給我們提供了任務標籤,所以我們平時用Elastic-Job寫的只是一個任務,而不是一個Bean。另外關於標籤的屬性,即: 定時的資訊,是以屬性配置的形式放在xml中的,我們可以看xsd檔案約束中找到,都有哪些屬性可以用,下圖
job的屬性
在這裡插入圖片描述
Elastic-Job會解析我們的xml任務資訊,並通過定時的相關引數,生成SpringJobScheduler物件,在哪裡進行著一操作呢?
感覺很怪異,找了很久才找到,竟然在每個任務的解析器中。為什麼這麼說呢? 因為實現都在抽象類中生成。
在這裡插入圖片描述
所有的任務解析器都實現了一個抽象方法AbstractJobBeanDefinitionParser。而在這裡面對我們寫的job標籤進行了解析生成job物件,作為屬性注入到SpringJobScheduler中,在init方法中,開始執行定時 任務(quartz)。

在這裡插入圖片描述

其實BeanDefinitionParse的主要職責是解析Bean物件的,而Elastic-Job巧妙的用來生成SpringJobScheduler。
由此聯想到Es Job的標籤都是 job:{taskType}開頭的,看來命名真的很有技巧,注意他不是一個bean而是SpringJobSchedulerBean的一個引數宣告 ! 還能這麼用! get 到一個新技能。
另外注意①: init初始化方法中完成定時任務的初始化操作,即開始定時,底層還是使用的quartz的一個封裝
②: shutdown回收資源,關閉執行緒池