利用Quartz來實現(xiàn)對任務(wù)的調(diào)度已經(jīng)被廣泛地應(yīng)用了,一個利用Quartz來進行任務(wù)調(diào)度的典型配置如下:
若有多個任務(wù)需要調(diào)度,則配置多個JobDetail、Trigger即可,待執(zhí)行的Task bean沒有啥任何要求,不需要extends任何class、或者implements任何interface,只是被執(zhí)行的method需要是無參數(shù)的;
但是在我們現(xiàn)實項目中,僅僅完成這樣的功能是還不夠的,我們還需要爭取完成以下幾點:
針對以上幾個問題,我們也都有很簡單、直接的辦法可以搞定,比如說1、2兩點可以直接在每個任務(wù)中各自編碼完成,但是這樣不僅每個task都要寫非常類似的重復(fù)代碼、而且不能保證每個任務(wù)的執(zhí)行情況都被記錄,因為某些task的編碼人員就不會在意這些非功能性需求;對于第3點,我們也可以通過配置來完成向不同task服務(wù)器部署不一樣的發(fā)布包來完成,但這給發(fā)布帶來了麻煩,這意味著有多少臺task服務(wù)器,就需要通過修改配置重新打包并發(fā)布多少次;
其實我們可以利用Spring默認提供的AOP來非常優(yōu)雅的解決這幾個問題:擴展MethodInvokingJobDetailFactoryBean來實現(xiàn)對任務(wù)調(diào)度時的攔截!其關(guān)鍵代碼為MethodInvokingJobDetailFactoryBean.MethodInvokingJob.executeInternal(JobExecutionContext context);這個method中;
具體步驟如下: