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檔案約束中找到,都有哪些屬性可以用,下圖
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回收資源,關閉執行緒池