Quartz作業(yè)調(diào)度基本使用詳解
Quartz核心概念
實(shí)際業(yè)務(wù)開(kāi)發(fā)中會(huì)遇到定時(shí)任務(wù)的情形,這種時(shí)候可以使用Quartz來(lái)幫助我們便捷地完成。
① Job
Job表示一個(gè)工作(任務(wù)),需要執(zhí)行的具體內(nèi)容。開(kāi)發(fā)中我們可以通過(guò)實(shí)現(xiàn)Job接口,來(lái)指定我們具體要執(zhí)行的工作。不過(guò)也可以直接寫(xiě)一個(gè)類,Spring會(huì)幫助我們做具體的注入。
public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
當(dāng)然我們可以使用Spring配置將Job注入容器,如下:
<bean id="helloJob" class="com.example.jobs.HelloJob"/>
② JobDetail
JobDetail表示一個(gè)具體的可執(zhí)行的調(diào)度程序,Job 是這個(gè)可執(zhí)行程調(diào)度程序所要執(zhí)行的內(nèi)容。我們需要通過(guò)JobDetail來(lái)對(duì)Job進(jìn)行綁定,具體如下:
JobDetail job = newJob(HelloJob.class) .withIdentity("helloJob", "group1") .build();
當(dāng)然我們也可以通過(guò)配置Spring將其注入到應(yīng)用容器當(dāng)中,如下:
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 注入目標(biāo)對(duì)象 --> <property name="targetObject" ref="helloJob"/> <!-- 注入目標(biāo)方法 --> <property name="targetMethod" value="sayHello"/> </bean>
③ TriggerTrigger定義執(zhí)行給定作業(yè)的計(jì)劃的組件。
Trigger trigger = newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(40) .repeatForever()) .build();
在Spring配置中繼續(xù)注冊(cè)我們的觸發(fā)器,如下:
<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 注入JobDetail --> <property name="jobDetail" ref="jobDetail"/> <!-- 指定觸發(fā)的時(shí)間,基于Cron表達(dá)式 --> <property name="cronExpression"> <!--<value>0 0 2 * * ?</value>--> <value>0/10 * * * * ?</value> </property> </bean>
④ SchedulerScheduler代表一個(gè)調(diào)度容器,一個(gè)調(diào)度容器中可以注冊(cè)多個(gè) JobDetail 和 Trigger。
//注冊(cè)trigger并啟動(dòng)scheduler scheduler.scheduleJob(job,trigger); scheduler.start();
在Spring中我們也使用對(duì)應(yīng)的FactoryBean來(lái)完成注冊(cè),如下:
<!-- 注冊(cè)一個(gè)統(tǒng)一的調(diào)度工廠,通過(guò)這個(gè)調(diào)度工廠調(diào)度任務(wù) --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 注入多個(gè)觸發(fā)器 --> <property name="triggers"> <list> <ref bean="myTrigger"/> </list> </property> </bean>
Quartz結(jié)合Spring使用的一些細(xì)節(jié)
autoStartup自動(dòng)啟動(dòng)
通過(guò)觀察代碼,我們不難發(fā)現(xiàn)在編碼中我們手動(dòng)去啟動(dòng)了scheduler,如下:
scheduler.start();
而在Spring中,我們使用了SchedulerFactoryBean,工廠Bean來(lái)完成scheduler對(duì)象的注入。我們并沒(méi)有顯示地去獲取scheduler對(duì)象,和啟動(dòng)任務(wù)調(diào)度。
因?yàn)樵赟pring bean相應(yīng)的生命周期內(nèi),框架已經(jīng)幫我們完成了啟動(dòng)與調(diào)度。
(此處我們不討論FactoryBean獲取bean對(duì)象的相關(guān)細(xì)節(jié),大家應(yīng)該清楚FactoryBean會(huì)通過(guò)getObject()來(lái)返回我們相應(yīng)的bean)
SchedulerFactoryBean自動(dòng)啟動(dòng)任務(wù)調(diào)度的部分源碼
通過(guò)查看源碼,我們可以看到SchedulerFactoryBean的屬性默認(rèn)支持scheduler的自動(dòng)啟動(dòng)。
我們也可以通過(guò)setAutoStartup()方法來(lái)禁用此選項(xiàng)。
private boolean autoStartup = true; /** * Set whether to automatically start the scheduler after initialization. * <p>Default is "true"; set this to "false" to allow for manual startup. */ public void setAutoStartup(boolean autoStartup) { this.autoStartup = autoStartup; }
JobDetail與Trigger
編碼形式的JobDetail與Trigger其實(shí)沒(méi)有直接綁定,理論上兩者都可以復(fù)用。但是Spring的形式中因?yàn)槲覀兪褂昧颂囟ǖ腇actoryBean,Trigger綁定了JobDetail,能夠復(fù)用的僅有JobDetail。
總結(jié)
Quartz的功能其實(shí)相當(dāng)強(qiáng)大,此案例只是使用了基本的功能,對(duì)于更深入的內(nèi)容沒(méi)有展開(kāi)討論,更多關(guān)于Quartz作業(yè)調(diào)度的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java獲取nvidia顯卡信息的實(shí)現(xiàn)示例
現(xiàn)在的需求是要獲取nvidia顯卡的使用情況,本文主要介紹了java獲取nvidia顯卡信息的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Java對(duì)象在內(nèi)存中的布局是如何實(shí)現(xiàn)的?
Java對(duì)象在內(nèi)存中屬于oop-klass二分模型,即對(duì)象的實(shí)例數(shù)據(jù)和對(duì)象類型的元數(shù)據(jù)(字段定義、方法、常量池等元數(shù)據(jù))是分開(kāi)存儲(chǔ)的.而由于JVM對(duì)對(duì)象內(nèi)相同寬度的字段分配在一起,所以只要指定了字段類型分配的順序,就可以計(jì)算出每種類型字段相對(duì)于當(dāng)前對(duì)象的偏移起始位置2021-06-06Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解
橋接,顧名思義,就是用來(lái)連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過(guò)示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下2022-09-09java GUI編程之布局控制器(Layout)實(shí)例分析
這篇文章主要介紹了java GUI編程之布局控制器(Layout),結(jié)合實(shí)例形式分析了java GUI編程中布局控制器(Layout)具體功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-01-01mybatis中方法返回泛型與resultType不一致的解決
這篇文章主要介紹了mybatis中方法返回泛型與resultType不一致的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10SpringBoot項(xiàng)目docker容器部署實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目docker容器部署實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03