JobRunShell
上篇博文帖蔓,博主講了Listener相關(guān)的內(nèi)容檬贰。本篇博文惭嚣,博主將要詳細(xì)介紹一下JobRunShell的功能。簡(jiǎn)單的來說悔政,JobRunShell就是Job實(shí)例運(yùn)行時(shí)所在的環(huán)境晚吞,也就是說在JobRunShell中調(diào)用Job接口的execute方法。
Runnable接口
在講解JobRunShell之前谋国,我們先了解或者加強(qiáng)一下Runnable接口的相關(guān)知識(shí)槽地。在java編程中,創(chuàng)建Thread一般有三種方式芦瘾。第一種是定義一個(gè)類去繼承Thread類捌蚊,并重寫run方法。第二種是在創(chuàng)建Thread的時(shí)候旅急,傳入對(duì)應(yīng)Runnable方法的實(shí)現(xiàn)逢勾。第二種是在創(chuàng)建Thread的時(shí)候牡整,傳入對(duì)應(yīng)FutureTask藐吮,F(xiàn)utureTask中含有Callable接口的引用。因此逃贝,我們知道需要在線程中運(yùn)行的對(duì)象可以實(shí)現(xiàn)Runnable方法谣辞。
并且博主的WorkThread博文中就介紹了工作者相關(guān)的內(nèi)容,它會(huì)接收ThreadPool線程池給它投遞的Runnable實(shí)體沐扳,因此查看JobRunShell的源碼可知泥从,它就是那個(gè)被投遞的實(shí)例對(duì)象。
方法定義
通過查看源碼可知沪摄,JobRunShell具有幾個(gè)重要的方法躯嫉,方法如下所示:
//初始化方法
void initialize(QuartzScheduler sched)
throws SchedulerException
//實(shí)現(xiàn)了Runnable的接口
void run();
//模板方法,可由子類重寫
void begin();
//模板方法杨拐,可由子類重寫
void complete();
initialize
initialize是JobRunShell的初始化方法祈餐。不知道細(xì)心的小伙伴有沒有方法,對(duì)于一些比較重要的對(duì)象而言哄陶,它都會(huì)有initialize方法帆阳。spring容器中的@bean注解就可以對(duì)應(yīng)bean的initMethod方法。
該方法邏輯如下:
- 會(huì)使用jobFactory實(shí)例化出對(duì)應(yīng)jobClass的對(duì)象屋吨,并且設(shè)置這個(gè)對(duì)象的其它屬性蜒谤。
- 構(gòu)造出jobExecutionContext接口的實(shí)例,該對(duì)象會(huì)作為參數(shù)至扰,在job接口的execute方法中傳入鳍徽。
run
run方法在線程運(yùn)行的時(shí)候被調(diào)用,它重寫之后的方法邏輯如下:
- 調(diào)用begin模板方法敢课,這里使用到了模板方法設(shè)計(jì)模式旬盯。
- 調(diào)用對(duì)應(yīng)的trigger監(jiān)聽器triggerFired方法。
- 調(diào)用對(duì)應(yīng)的trigger監(jiān)聽器vetoJobExecution方法,判斷是否需要拒絕執(zhí)行胖翰。
- 調(diào)用對(duì)應(yīng)的job監(jiān)聽器的jobExecutionVetoed方法接剩。
- 會(huì)調(diào)用job的execute方法,并傳入jobExecutionContext實(shí)例萨咳,同時(shí)記錄執(zhí)行時(shí)間懊缺。
- 調(diào)用對(duì)應(yīng)的job監(jiān)聽器的jobWasExecuted方法。
- 調(diào)用該trigger的executionComplete方法培他,得到trigger的完成策略鹃两。
- 調(diào)用complete模板方法
- 通知jobStoreJob執(zhí)行完成,調(diào)用JobStore的triggeredJobComplete方法舀凛。(如tigger沒有下次觸發(fā)時(shí)間俊扳,就需要?jiǎng)h除調(diào)trigger)。
博主微信公眾號(hào)
<img src="https://gitee.com/chenhaogit/blogimages/raw/master/xsj/wzgzh-8cm.jpg" style="float:right"/>