當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring+Quartz 集群
生活随笔
收集整理的這篇文章主要介紹了
Spring+Quartz 集群
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載?http://soulshard.iteye.com/blog/337886
單獨(dú)的Quartz集群在http://unmi.blogjava.net/有Unmi翻譯的Quartz Job Scheduling Framework一書做了詳細(xì)說明,在此不再重復(fù)。?
Spring+Quartz不集群的方式google百度也可以搜索出來一大堆,同樣略過。?
要點(diǎn)1 在Spring中使用Quartz的高級(jí)配置?
問題描述?Quartz集群僅能使用JDBC JobStore工作,需要在Spring中使用Quartz的高級(jí)配置?
解決辦法1.1?通過SchedulerFactoryBean的configLocation屬性指定Quartz配置文件的位置。?
Xml代碼??<bean?id="quartzJobFactory"?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">?? ????<property?name="triggers">?? ????????<list>?? ????????????<ref?bean="clusterTesterJobScheduledTask"?/>?? ????????</list>?? ????</property>?? ????<property?name="configLocation"?value="classpath:quartz.properties"?/>?? </bean>??
解決辦法1.2?通過SchedulerFactoryBean的quartzProperties屬性直接配置。?
要點(diǎn)2 NotSerializableException?
問題描述?在將Quartz的Job持久化到數(shù)據(jù)庫的過程中產(chǎn)生NotSerializableException。詳細(xì)異常信息為:?
java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean?
解決辦法?這是Spring的一個(gè)Bug,具體解決方案見http://jira.springframework.org/browse/SPR-3797,上面有解決的MethodInvokingJobDetailFactoryBean代碼。?
要點(diǎn)3 還是NotSerializableException?
問題描述?雖然MethodInvokingJobDetailFactoryBean的問題解決了,但是QuartzJob或者QuartzJob的屬性沒有實(shí)現(xiàn)Serializable接口(比如在QuartzJob中注入了DAO)。?
解決辦法3.1?如果是自己可以掌握的代碼,可以為這些QuartzJob及其屬性都加上實(shí)現(xiàn)Serializable接口。?
解決辦法3.2?編寫一個(gè)實(shí)現(xiàn)Serializable接口,沒有屬性的QuartzJob,讓它從Spring容器(ApplicationContext)中獲取原來的那個(gè)QuartzJob的Bean,再調(diào)用原來QuartzJob的方法解決問題。該方法的問題在于怎么獲取ApplicationContext,如果用ClassPathXmlApplicationContext,等于是另外創(chuàng)建了一個(gè)Spring容器(web.xml里面定義的是另外一個(gè))。?
解決辦法3.3?將原有的接口暴露,在Job中想辦法遠(yuǎn)程調(diào)用該接口。?
這三種辦法各有好壞,現(xiàn)在也想不出其他更好的辦法,先用這些頂著吧。?
要點(diǎn)4 集群之后把其中一個(gè)Quartz服務(wù)停了,其他的也不接手工作?
問題描述?集群之后,A節(jié)點(diǎn)執(zhí)行了大多數(shù)任務(wù),B節(jié)點(diǎn)大部分時(shí)間處于空閑,停掉A節(jié)點(diǎn),B節(jié)點(diǎn)也不會(huì)接手工作。?
解決辦法?修改Quartz的配置,將每個(gè)節(jié)點(diǎn)的org.quartz.scheduler.instanceId設(shè)置為不同的值,或者都設(shè)置為AUTO。另外org.quartz.jobStore.isClustered屬性必須設(shè)為true,org.quartz.jobStore.clusterCheckinInterval屬性為集群中每次檢查的時(shí)間間隔(按我的理解,應(yīng)該差不多等于一個(gè)服務(wù)器掛了之后,其他服務(wù)器接手的時(shí)間),單位為毫秒,默認(rèn)值是15000。?
要點(diǎn)5 MethodInvokingJobDetailFactoryBean幾個(gè)屬性的作用?
問題描述?MethodInvokingJobDetailFactoryBean中concurrent和shouldRecover屬性的作用?
解釋?concurrent為true,則允許一個(gè)QuartzJob并發(fā)執(zhí)行,否則就是順序執(zhí)行。例如QuartzJob A執(zhí)行時(shí)間為15秒,配置為每10秒執(zhí)行一次;如果concurrent為true,則0秒的時(shí)候啟動(dòng)一次A,10秒的時(shí)候再啟動(dòng)一次A,20秒的時(shí)候再啟動(dòng)一次A,不管前面啟動(dòng)的A有沒有執(zhí)行完;如果concurrent為false,則0秒的時(shí)候啟動(dòng)一次A,15秒的時(shí)候A執(zhí)行完畢,再第二次啟動(dòng)A。?
shouldRecover屬性為true,則當(dāng)Quartz服務(wù)被中止后,再次啟動(dòng)或集群中其他機(jī)器接手任務(wù)時(shí)會(huì)嘗試恢復(fù)執(zhí)行之前未完成的所有任務(wù)。例如QuartzJob B,在每次00秒的時(shí)候啟動(dòng),假如在03:00的任務(wù)執(zhí)行完之后服務(wù)器1被中止,服務(wù)器2在05:15的時(shí)候才接手;如果shouldRecover屬性為true,則服務(wù)器2會(huì)嘗試著補(bǔ)回原來在04:00和05:00的時(shí)候應(yīng)該做的任務(wù),如果shouldRecover屬性為false,則服務(wù)器2只會(huì)從06:00的時(shí)候再執(zhí)行B。?
附件是一個(gè)Demo,使用數(shù)據(jù)庫為Oracle,創(chuàng)建數(shù)據(jù)庫表的SQL腳本可以在Quartz的發(fā)行包(http://www.opensymphony.com/quartz/download.action)中\(zhòng)docs\dbTables目錄下找到。數(shù)據(jù)庫相關(guān)配置都在quartz.properties中,可根據(jù)實(shí)際需要自行修改。
單獨(dú)的Quartz集群在http://unmi.blogjava.net/有Unmi翻譯的Quartz Job Scheduling Framework一書做了詳細(xì)說明,在此不再重復(fù)。?
Spring+Quartz不集群的方式google百度也可以搜索出來一大堆,同樣略過。?
要點(diǎn)1 在Spring中使用Quartz的高級(jí)配置?
問題描述?Quartz集群僅能使用JDBC JobStore工作,需要在Spring中使用Quartz的高級(jí)配置?
解決辦法1.1?通過SchedulerFactoryBean的configLocation屬性指定Quartz配置文件的位置。?
Xml代碼??
解決辦法1.2?通過SchedulerFactoryBean的quartzProperties屬性直接配置。?
要點(diǎn)2 NotSerializableException?
問題描述?在將Quartz的Job持久化到數(shù)據(jù)庫的過程中產(chǎn)生NotSerializableException。詳細(xì)異常信息為:?
java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean?
解決辦法?這是Spring的一個(gè)Bug,具體解決方案見http://jira.springframework.org/browse/SPR-3797,上面有解決的MethodInvokingJobDetailFactoryBean代碼。?
要點(diǎn)3 還是NotSerializableException?
問題描述?雖然MethodInvokingJobDetailFactoryBean的問題解決了,但是QuartzJob或者QuartzJob的屬性沒有實(shí)現(xiàn)Serializable接口(比如在QuartzJob中注入了DAO)。?
解決辦法3.1?如果是自己可以掌握的代碼,可以為這些QuartzJob及其屬性都加上實(shí)現(xiàn)Serializable接口。?
解決辦法3.2?編寫一個(gè)實(shí)現(xiàn)Serializable接口,沒有屬性的QuartzJob,讓它從Spring容器(ApplicationContext)中獲取原來的那個(gè)QuartzJob的Bean,再調(diào)用原來QuartzJob的方法解決問題。該方法的問題在于怎么獲取ApplicationContext,如果用ClassPathXmlApplicationContext,等于是另外創(chuàng)建了一個(gè)Spring容器(web.xml里面定義的是另外一個(gè))。?
解決辦法3.3?將原有的接口暴露,在Job中想辦法遠(yuǎn)程調(diào)用該接口。?
這三種辦法各有好壞,現(xiàn)在也想不出其他更好的辦法,先用這些頂著吧。?
要點(diǎn)4 集群之后把其中一個(gè)Quartz服務(wù)停了,其他的也不接手工作?
問題描述?集群之后,A節(jié)點(diǎn)執(zhí)行了大多數(shù)任務(wù),B節(jié)點(diǎn)大部分時(shí)間處于空閑,停掉A節(jié)點(diǎn),B節(jié)點(diǎn)也不會(huì)接手工作。?
解決辦法?修改Quartz的配置,將每個(gè)節(jié)點(diǎn)的org.quartz.scheduler.instanceId設(shè)置為不同的值,或者都設(shè)置為AUTO。另外org.quartz.jobStore.isClustered屬性必須設(shè)為true,org.quartz.jobStore.clusterCheckinInterval屬性為集群中每次檢查的時(shí)間間隔(按我的理解,應(yīng)該差不多等于一個(gè)服務(wù)器掛了之后,其他服務(wù)器接手的時(shí)間),單位為毫秒,默認(rèn)值是15000。?
要點(diǎn)5 MethodInvokingJobDetailFactoryBean幾個(gè)屬性的作用?
問題描述?MethodInvokingJobDetailFactoryBean中concurrent和shouldRecover屬性的作用?
解釋?concurrent為true,則允許一個(gè)QuartzJob并發(fā)執(zhí)行,否則就是順序執(zhí)行。例如QuartzJob A執(zhí)行時(shí)間為15秒,配置為每10秒執(zhí)行一次;如果concurrent為true,則0秒的時(shí)候啟動(dòng)一次A,10秒的時(shí)候再啟動(dòng)一次A,20秒的時(shí)候再啟動(dòng)一次A,不管前面啟動(dòng)的A有沒有執(zhí)行完;如果concurrent為false,則0秒的時(shí)候啟動(dòng)一次A,15秒的時(shí)候A執(zhí)行完畢,再第二次啟動(dòng)A。?
shouldRecover屬性為true,則當(dāng)Quartz服務(wù)被中止后,再次啟動(dòng)或集群中其他機(jī)器接手任務(wù)時(shí)會(huì)嘗試恢復(fù)執(zhí)行之前未完成的所有任務(wù)。例如QuartzJob B,在每次00秒的時(shí)候啟動(dòng),假如在03:00的任務(wù)執(zhí)行完之后服務(wù)器1被中止,服務(wù)器2在05:15的時(shí)候才接手;如果shouldRecover屬性為true,則服務(wù)器2會(huì)嘗試著補(bǔ)回原來在04:00和05:00的時(shí)候應(yīng)該做的任務(wù),如果shouldRecover屬性為false,則服務(wù)器2只會(huì)從06:00的時(shí)候再執(zhí)行B。?
附件是一個(gè)Demo,使用數(shù)據(jù)庫為Oracle,創(chuàng)建數(shù)據(jù)庫表的SQL腳本可以在Quartz的發(fā)行包(http://www.opensymphony.com/quartz/download.action)中\(zhòng)docs\dbTables目錄下找到。數(shù)據(jù)庫相關(guān)配置都在quartz.properties中,可根據(jù)實(shí)際需要自行修改。
- SpringQuartzClusterDemo.rar?(5 MB)
轉(zhuǎn)載于:https://www.cnblogs.com/chenying99/archive/2012/11/24/2785330.html
總結(jié)
以上是生活随笔為你收集整理的Spring+Quartz 集群的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ValueError: Untermin
- 下一篇: 一个特殊的内码转换处理对于XML格式的U