日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring+Quartz 集群

發布時間:2025/3/15 javascript 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring+Quartz 集群 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載?http://soulshard.iteye.com/blog/337886
單獨的Quartz集群在http://unmi.blogjava.net/有Unmi翻譯的Quartz Job Scheduling Framework一書做了詳細說明,在此不再重復。?

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持久化到數據庫的過程中產生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的屬性沒有實現Serializable接口(比如在QuartzJob中注入了DAO)。?
    解決辦法3.1?如果是自己可以掌握的代碼,可以為這些QuartzJob及其屬性都加上實現Serializable接口。?
    解決辦法3.2?編寫一個實現Serializable接口,沒有屬性的QuartzJob,讓它從Spring容器(ApplicationContext)中獲取原來的那個QuartzJob的Bean,再調用原來QuartzJob的方法解決問題。該方法的問題在于怎么獲取ApplicationContext,如果用ClassPathXmlApplicationContext,等于是另外創建了一個Spring容器(web.xml里面定義的是另外一個)。?
    解決辦法3.3?將原有的接口暴露,在Job中想辦法遠程調用該接口。?
    這三種辦法各有好壞,現在也想不出其他更好的辦法,先用這些頂著吧。?

    要點4 集群之后把其中一個Quartz服務停了,其他的也不接手工作?
    問題描述?集群之后,A節點執行了大多數任務,B節點大部分時間處于空閑,停掉A節點,B節點也不會接手工作。?
    解決辦法?修改Quartz的配置,將每個節點的org.quartz.scheduler.instanceId設置為不同的值,或者都設置為AUTO。另外org.quartz.jobStore.isClustered屬性必須設為true,org.quartz.jobStore.clusterCheckinInterval屬性為集群中每次檢查的時間間隔(按我的理解,應該差不多等于一個服務器掛了之后,其他服務器接手的時間),單位為毫秒,默認值是15000。?

    要點5 MethodInvokingJobDetailFactoryBean幾個屬性的作用?
    問題描述?MethodInvokingJobDetailFactoryBean中concurrent和shouldRecover屬性的作用?
    解釋?concurrent為true,則允許一個QuartzJob并發執行,否則就是順序執行。例如QuartzJob A執行時間為15秒,配置為每10秒執行一次;如果concurrent為true,則0秒的時候啟動一次A,10秒的時候再啟動一次A,20秒的時候再啟動一次A,不管前面啟動的A有沒有執行完;如果concurrent為false,則0秒的時候啟動一次A,15秒的時候A執行完畢,再第二次啟動A。?
    shouldRecover屬性為true,則當Quartz服務被中止后,再次啟動或集群中其他機器接手任務時會嘗試恢復執行之前未完成的所有任務。例如QuartzJob B,在每次00秒的時候啟動,假如在03:00的任務執行完之后服務器1被中止,服務器2在05:15的時候才接手;如果shouldRecover屬性為true,則服務器2會嘗試著補回原來在04:00和05:00的時候應該做的任務,如果shouldRecover屬性為false,則服務器2只會從06:00的時候再執行B。?

    附件是一個Demo,使用數據庫為Oracle,創建數據庫表的SQL腳本可以在Quartz的發行包(http://www.opensymphony.com/quartz/download.action)中\docs\dbTables目錄下找到。數據庫相關配置都在quartz.properties中,可根據實際需要自行修改。
    • SpringQuartzClusterDemo.rar?(5 MB)
    網友回復 3.2方案很合理,于是乎擴展了Spring quartz,測試用例請看http://download.csdn.net/source/2777549

    轉載于:https://www.cnblogs.com/chenying99/archive/2012/11/24/2785330.html

    總結

    以上是生活随笔為你收集整理的Spring+Quartz 集群的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。