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