Quartz作業(yè)調(diào)度基本使用詳解
Quartz核心概念
實(shí)際業(yè)務(wù)開發(fā)中會(huì)遇到定時(shí)任務(wù)的情形,這種時(shí)候可以使用Quartz來幫助我們便捷地完成。
① Job
Job表示一個(gè)工作(任務(wù)),需要執(zhí)行的具體內(nèi)容。開發(fā)中我們可以通過實(shí)現(xiàn)Job接口,來指定我們具體要執(zhí)行的工作。不過也可以直接寫一個(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)容。我們需要通過JobDetail來對(duì)Job進(jìn)行綁定,具體如下:
JobDetail job = newJob(HelloJob.class)
.withIdentity("helloJob", "group1")
.build();
當(dāng)然我們也可以通過配置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來完成注冊(cè),如下:
<!-- 注冊(cè)一個(gè)統(tǒng)一的調(diào)度工廠,通過這個(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)
通過觀察代碼,我們不難發(fā)現(xiàn)在編碼中我們手動(dòng)去啟動(dòng)了scheduler,如下:
scheduler.start();
而在Spring中,我們使用了SchedulerFactoryBean,工廠Bean來完成scheduler對(duì)象的注入。我們并沒有顯示地去獲取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ì)通過getObject()來返回我們相應(yīng)的bean)
SchedulerFactoryBean自動(dòng)啟動(dòng)任務(wù)調(diào)度的部分源碼
通過查看源碼,我們可以看到SchedulerFactoryBean的屬性默認(rèn)支持scheduler的自動(dòng)啟動(dòng)。
我們也可以通過setAutoStartup()方法來禁用此選項(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í)沒有直接綁定,理論上兩者都可以復(fù)用。但是Spring的形式中因?yàn)槲覀兪褂昧颂囟ǖ腇actoryBean,Trigger綁定了JobDetail,能夠復(fù)用的僅有JobDetail。
總結(jié)
Quartz的功能其實(shí)相當(dāng)強(qiáng)大,此案例只是使用了基本的功能,對(duì)于更深入的內(nè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-02
Java對(duì)象在內(nèi)存中的布局是如何實(shí)現(xiàn)的?
Java對(duì)象在內(nèi)存中屬于oop-klass二分模型,即對(duì)象的實(shí)例數(shù)據(jù)和對(duì)象類型的元數(shù)據(jù)(字段定義、方法、常量池等元數(shù)據(jù))是分開存儲(chǔ)的.而由于JVM對(duì)對(duì)象內(nèi)相同寬度的字段分配在一起,所以只要指定了字段類型分配的順序,就可以計(jì)算出每種類型字段相對(duì)于當(dāng)前對(duì)象的偏移起始位置2021-06-06
Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解
橋接,顧名思義,就是用來連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下2022-09-09
java GUI編程之布局控制器(Layout)實(shí)例分析
這篇文章主要介紹了java GUI編程之布局控制器(Layout),結(jié)合實(shí)例形式分析了java GUI編程中布局控制器(Layout)具體功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-01-01
mybatis中方法返回泛型與resultType不一致的解決
這篇文章主要介紹了mybatis中方法返回泛型與resultType不一致的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
SpringBoot項(xiàng)目docker容器部署實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目docker容器部署實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03

