新聞中心
怎么理解Quartz 中的JobStore接口,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司制作網(wǎng)站網(wǎng)頁找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司,網(wǎng)站設(shè)計(jì),企業(yè)網(wǎng)站搭建,網(wǎng)站開發(fā),建網(wǎng)站業(yè)務(wù),680元做網(wǎng)站,已為上千家服務(wù),成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)將一如既往的為我們的客戶提供最優(yōu)質(zhì)的網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷推廣服務(wù)!
org.quartz.spi.JobStore 是任務(wù)存儲(chǔ)的頂層接口類
org.quartz.simpl.RAMJobStore 是內(nèi)存存儲(chǔ)機(jī)制實(shí)現(xiàn)類
org.quartz.impl.jdbcjobstore.JobStoreSupport 是基于JDBC數(shù)據(jù)庫(kù)存儲(chǔ)的抽象類
org.quartz.impl.jdbcjobstore.JobStoreCMT 是受應(yīng)用容器管理事物的數(shù)據(jù)庫(kù)存儲(chǔ)實(shí)現(xiàn)類
org.quartz.impl.jdbcjobstore.JobStoreTX 是不受應(yīng)用容器事物管理的數(shù)據(jù)庫(kù)存儲(chǔ)實(shí)現(xiàn)類
org.quartz.jobStore.class = 上面提到的具體實(shí)現(xiàn)類
在quzrtz.properties 中配置以上代碼來告訴quartz我們使用何種存儲(chǔ)機(jī)制
存儲(chǔ)機(jī)制對(duì)比
內(nèi)存存儲(chǔ)機(jī)制 org.quartz.simpl.RAMJobStore 使用內(nèi)存存儲(chǔ)的優(yōu)點(diǎn)是任務(wù)的存儲(chǔ)和讀取的速度極快,和數(shù)據(jù)庫(kù)持久化相比差別還是非常大的,而且框架搭建簡(jiǎn)單,開箱即用。它的缺點(diǎn)是當(dāng)Quartz程序或應(yīng)用程序停止了,伴隨在內(nèi)存中的數(shù)據(jù)也會(huì)被回收,任務(wù)等數(shù)據(jù)就永久丟失了。
數(shù)據(jù)庫(kù)存儲(chǔ)機(jī)制 org.quartz.impl.jdbcjobstore.JobStoreTX TX就是事物的意思,此存儲(chǔ)機(jī)制用于Quartz獨(dú)立于應(yīng)用容器的事物管理,如果是Tomcat容器管理的數(shù)據(jù)源,那我們定義的事物也不會(huì)傳播給Quartz框架內(nèi)部。通俗的講就是不管我們的Service服務(wù)本身業(yè)務(wù)代碼是否執(zhí)行成功,只要代碼中調(diào)用了Quartz API的數(shù)據(jù)庫(kù)操作,那任務(wù)狀態(tài)就永久持久化了,就算業(yè)務(wù)代碼拋出運(yùn)行時(shí)異常任務(wù)狀態(tài)也不會(huì)回滾到之前的狀態(tài)。 org.quartz.impl.jdbcjobstore.JobStoreCMT CMT的全稱是Container Managed Transactions,表示容器管理事物,也就是讓應(yīng)用容器托管事物。這里假設(shè)應(yīng)用容器是Tomcat,并且項(xiàng)目和Quartz都是使用Tomcat配置的數(shù)據(jù)源,那么項(xiàng)目和Quartz的代碼中就可以共用同一個(gè)事物,不管是業(yè)務(wù)代碼還是Quartz內(nèi)部拋出異常,Service服務(wù)內(nèi)的所有數(shù)據(jù)操作都會(huì)回滾到原始狀態(tài)。JobStoreCMT和JobStoreTX最大的區(qū)別是JobStoreCMT需要配置兩個(gè)數(shù)據(jù)源,一個(gè)是受應(yīng)用容器管理的數(shù)據(jù)源,還有一個(gè)是不受應(yīng)用容器管理的數(shù)據(jù)源。 這里需要想一想為什么需要兩個(gè)數(shù)據(jù)源? 我個(gè)人的理解是不受應(yīng)用容器管理的數(shù)據(jù)源用來由Quartz內(nèi)部進(jìn)行"增刪改查",假如一個(gè)觸發(fā)器已失效,那么Quartz框架內(nèi)部就會(huì)自動(dòng)刪除這個(gè)觸發(fā)器并提交事物,而無需開發(fā)人員的項(xiàng)目代碼來處理,全由Quartz內(nèi)部管理。
選用哪種存儲(chǔ)方式
什么情況下使用RAMJobStore內(nèi)存存儲(chǔ)方式呢?
??根據(jù)開發(fā)中的使用經(jīng)驗(yàn),發(fā)現(xiàn)有些任務(wù)是隨著項(xiàng)目啟動(dòng)而啟動(dòng)的,就算項(xiàng)目關(guān)閉或系統(tǒng)宕機(jī),那也沒關(guān)系,因?yàn)轫?xiàng)目重新啟動(dòng)后此任務(wù)又會(huì)隨之啟動(dòng)。如果項(xiàng)目中只存在這類任務(wù),那么就可以用內(nèi)存存儲(chǔ)。隨著項(xiàng)目啟動(dòng)有幾種常用的實(shí)現(xiàn)方式,第一種是通過實(shí)現(xiàn)ServletContextListener監(jiān)聽器接口,然后在接口實(shí)現(xiàn)類的contextInitialized()方法中編寫啟動(dòng)Job的硬編碼;第二種是通過Quartz的XML配置文件啟動(dòng)任務(wù)。
什么情況下使用JobStoreTX數(shù)據(jù)庫(kù)存儲(chǔ)方式呢?
?使用這種方式需要注意的是,如果在一個(gè)業(yè)務(wù)代碼中需要?jiǎng)?chuàng)建一個(gè)Job,那么請(qǐng)把創(chuàng)建Job的代碼編寫在服務(wù)代碼的最后面,確保業(yè)務(wù)代碼運(yùn)行成功并且沒有拋異常再去啟動(dòng)Job,如果啟動(dòng)Job失敗的時(shí)候請(qǐng)拋出一個(gè)運(yùn)行時(shí)異常使業(yè)務(wù)代碼進(jìn)行回滾。
例子:
@Transactional public void demoService(TaskStore taskStore) { // 先執(zhí)行插入業(yè)務(wù)操作 taskStoreService.insert(taskStore); // 再執(zhí)行更新業(yè)務(wù)操作 taskDetailService.update(taskDetail); // 最后啟動(dòng)定時(shí)任務(wù) QuartzUtils.addJob("testName", DemoJob.class, "0 * * * * * ?"); }
注意例子中的addJob()方法中捕獲了異常后進(jìn)行重新封裝再拋出運(yùn)行時(shí)異常的,目的是Quartz內(nèi)部錯(cuò)誤時(shí)確保業(yè)務(wù)代碼回滾。
什么情況下使用JobStoreCMT數(shù)據(jù)庫(kù)存儲(chǔ)方式呢?
??JobStoreCMT和JobStoreTX的區(qū)別前文已經(jīng)介紹了,在實(shí)際開發(fā)的過程中我還沒有在項(xiàng)目中使用過此種方式。一般情況下都是使用的JobStoreTX。如果大家的項(xiàng)目中有著嚴(yán)格的事物管理,那么建議使用JobStoreCMT存儲(chǔ)方式。
@Component public class JobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { // 調(diào)用父類的方法 Object jobInstance = super.createJobInstance(bundle); // 進(jìn)行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } } 這個(gè)類的作用就是講Job的實(shí)例化交給IOC去進(jìn)行。 其實(shí)問題在于: Job對(duì)象的實(shí)例化過程是在Quartz中進(jìn)行的,注入的實(shí)體類是在Spring容器當(dāng)中的 所以在job中無法注入Srping容器的實(shí)體類。 解決方案:將Job Bean也納入到Spring容器的管理之中,Spring容器自然能夠?yàn)镴ob Bean自動(dòng)裝配好所需的依賴。 如何納入:Job的創(chuàng)建都是通過JobFactory創(chuàng)建的。 官網(wǎng)解釋為證: 翻譯:JobFactory負(fù)責(zé)生成Job類的實(shí)例。 JobFactory 有2個(gè)實(shí)現(xiàn)類:AdaptableJobFactory 和 SimpleJobFactory。 自定義的工廠類 JobFactory 繼承 AdaptableJobFactory 。 通過調(diào)用父類 AdaptableJobFactory 的方法createJobInstance來實(shí)現(xiàn)對(duì)Job的實(shí)例化。 在Job實(shí)例化完以后,再調(diào)用自身方法為創(chuàng)建好的Job實(shí)例進(jìn)行屬性自動(dòng)裝配并將其納入到Spring容器的管理之中。(通過AutowireCapableBeanFactory納入)。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
本文題目:怎么理解Quartz中的JobStore接口
網(wǎng)頁網(wǎng)址:http://www.ef60e0e.cn/article/pjpsoo.html