瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Quartz+Spring的集群配置(轉)

          Posted on 2012-05-11 11:02 瘋狂 閱讀(18437) 評論(1)  編輯  收藏 所屬分類: java spring架構
          原來配置的Quartz是通過spring配置文件生效的,發現在非集群式的服務器上運行良好,但是將工程部署到水平集群服務器上去后改定時功能不能正常運行,沒有任何錯誤日志,于是從jar包、JDK版本、cronExpression到服務器類型,甚至查到了服務器操作系統的類型,都沒能找到解決的辦法,后來才知道是集群惹的禍!

                  詳細步驟如下:

          1、 按照Quartz集群工作原理

          圖:表示了每個節點直接與數據庫通信,若離開數據庫將對其他節點一無所知

           

          在數據庫中建表。建表模版在Quartz包下docs/dbTables下,選擇相應的數據庫和版本即可。DB2_V8的11個Table列表如下:

          QRTZ_JOB_LISTENERS

          QRTZ_TRIGGER_LISTENERS

          QRTZ_FIRED_TRIGGERS

          QRTZ_PAUSED_TRIGGER_GRPS

          QRTZ_SCHEDULER_STATE

          QRTZ_LOCKS

          QRTZ_SIMPLE_TRIGGERS

          QRTZ_CRON_TRIGGERS

          QRTZ_TRIGGERS

          QRTZ_JOB_DETAILS

          QRTZ_CALENDARS

          QRTZ_BLOB_TRIGGERS

          2、 配置數據庫連接池,如果spring已經配置則不需要再另行配置,只需在后面配置的applicationContext-quartz.xml引入即可。

          applicationContext.xml:

           

           1<bean id="propertyConfigurer"  
           2class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            
           3           <property name="location">
            
           4           <value>classpath:dataConfig.properties</value>
            
           5           </property>
            
           6</bean>
            
           7      <bean id="ds34" class="org.apache.commons.dbcp.BasicDataSource"
            
           8           destroy-method="close">
            
           9           <property name="driverClassName">
            
          10                 <value>${ds34.driver}</value>
            
          11           </property>
            
          12           <property name="url">
            
          13                 <value>${ds34.url}</value>
            
          14           </property>
            
          15           <property name="username">
            
          16                 <value>${ds34.username}</value>
            
          17           </property>
            
          18           <property name="password">
            
          19                 <value>${ds34.password}</value>
            
          20           </property>
            
          21           <property name="maxActive" value="5"></property>
            
          22           <property name="maxIdle" value="20"></property>
            
          23           <property name="maxWait" value="50"></property>
            
          24           <property name="defaultAutoCommit" value="true"></property>
            
          25</bean>  

           

          dataConfig.properties:

          ds34.driver=com.ibm.db2.jcc.DB2Driver   
          ds34.url
          =jdbc:db2://192.168.*.*:50000/XXXX   

          ds34.username=admin  
          ds34.password
          =*******

          3、 配置quartz.properties

          org.quartz.scheduler.instanceName屬性可為任何值,用在 JDBC JobStore 中來唯一標識實例,但是所有集群節點中必須相同。
          org.quartz.scheduler.instanceId 屬性為 AUTO即可,基于主機名和時間戳來產生實例 ID。
          org.quartz.jobStore.class屬性為 JobStoreTX,將任務持久化到數據中。因為集群中節點依賴于數據庫來傳播 Scheduler 實例的狀態,你只能在使用 JDBC JobStore 時應用 Quartz 集群。這意味著你必須使用 JobStoreTX 或是 JobStoreCMT 作為 Job 存儲;你不能在集群中使用 RAMJobStore。
          org.quartz.jobStore.isClustered 屬性為 true,你就告訴了 Scheduler 實例要它參與到一個集群當中。這一屬性會貫穿于調度框架的始終,用于修改集群環境中操作的默認行為。
          org.quartz.jobStore.clusterCheckinInterval 屬性定義了Scheduler 實例檢入到數據庫中的頻率(單位:毫秒)。Scheduler 檢查是否其他的實例到了它們應當檢入的時候未檢入;這能指出一個失敗的 Scheduler 實例,且當前 Scheduler 會以此來接管任何執行失敗并可恢復的 Job。通過檢入操作,Scheduler 也會更新自身的狀態記錄。clusterChedkinInterval 越小,Scheduler 節點檢查失敗的 Scheduler 實例就越頻繁。默認值是 15000 (即15 秒)。

          quartz.properties:

           

           1##Quartz 調度任務所需的配置文件   
           2
            
           3
          ##org.quartz.scheduler.instanceName屬性可為任何值,用在 JDBC JobStore 中來唯一標識實例,但是所有集群節點中必須相同。   
           4org.quartz.scheduler.instanceName =
           HumsScheduler         
           5
          ##org.quartz.scheduler.instanceId 屬性為 AUTO即可,基于主機名和時間戳來產生實例 ID。   
           6org.quartz.scheduler.instanceId =
           AUTO        
           7
               
           8orgorg.quartz.threadPool.class =
           org.quartz.simpl.SimpleThreadPool       
           9org.quartz.threadPool.threadCount = 10
                 
          10org.quartz.threadPool.threadPriority = 5
                 
          11org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread =
           true      
          12
              
          13org.quartz.jobStore.misfireThreshold = 60000
                
          14
           ##org.quartz.jobStore.class屬性為 JobStoreTX,將任務持久化到數據中。   
          15
           ##因為集群中節點依賴于數據庫來傳播 Scheduler 實例的狀態,你只能在使用 JDBC JobStore 時應用 Quartz 集群。   
          16
           ##這意味著你必須使用 JobStoreTX 或是 JobStoreCMT 作為 Job 存儲;你不能在集群中使用 RAMJobStore。   
          17orgorg.quartz.jobStore.class =
           org.quartz.impl.jdbcjobstore.JobStoreTX       
          18orgorg.quartz.jobStore.driverDelegateClass=
          org.quartz.impl.jdbcjobstore.StdJDBCDelegate       
          19org.quartz.jobStore.tablePrefix =
           QRTZ_       
          20org.quartz.jobStore.maxMisfiresToHandleAtATime=10
                 
          21
          ##org.quartz.jobStore.isClustered 屬性為 true,你就告訴了 Scheduler 實例要它參與到一個集群當中。   
          22
          ##這一屬性會貫穿于調度框架的始終,用于修改集群環境中操作的默認行為。   
          23org.quartz.jobStore.isClustered =
           true        
          24
          ##org.quartz.jobStore.clusterCheckinInterval 屬性定義了Scheduler 實例檢入到數據庫中的頻率(單位:毫秒)。   
          25
          ##Scheduler 檢查是否其他的實例到了它們應當檢入的時候未檢入;這能指出一個失敗的 Scheduler 實例,且當前 Scheduler 會以此來接管任何執行失敗并可恢復的 Job。   
          26##通過檢入操作,Scheduler 也會更新自身的狀態記錄。clusterChedkinInterval 越小,Scheduler 節點檢查失敗的 Scheduler 實例就越頻繁。默認值是 15000
           (即15 秒)。   
          27org.quartz.jobStore.clusterCheckinInterval = 20000

          4、 配置applicationContext-quartz.xml

           

           1<?xml version="1.0" encoding="UTF-8"?>       
           2
            
           3<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
                 
           4<beans>
                 
           5    <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                 
           6        <property name="dataSource">
                 
           7            <ref bean="ds34"/>  <!--數據源引用指向,包含集群所需的所有表-->
            
           8        </property>
                 
           9        <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
               
          10<!--applicationContextSchedulerContextKey: 是org.springframework.scheduling.quartz.SchedulerFactoryBean這個類中把spring上下 文以key/value的方式存放在了quartz的上下文中了,可以用applicationContextSchedulerContextKey所定義的key得到對應的spring上下文-->
            
          11        <property name="configLocation" value="classpath:quartz.properties"/>
                
          12<!--configLocation:用于指明quartz的配置文件的位置 -->
              
          13      <property name="triggers">
                 
          14            <list>
                   
          15                  <ref bean="trigger1"/>
                 
          16            </list>
                 
          17      </property>
                 
          18    </bean>
                
          19<bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean">
            
          20      <property name="jobClass">
            
          21            <value>繼承QuartzJobBean的類的引用,如果不繼承QuartzJobBean可以參考 http://www.javaeye.com/topic/486055</value>
            
          22      </property>
            
          23</bean>
            
          24    <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerBean">
                 
          25        <property name="jobDetail" ref="jobDetail1"/>
                 
          26        <property name="cronExpression" value="0 0/5 * ? * * *"/>
                 
          27<!—cronExpression 表達式 -->
            
          28    </bean>
                    
          29</beans>

           

            5、 配置Job任務注意:加入定時任務有兩種方式:

          ①     繼承QuartzJobBean的類,重寫executeInternal(),詳細寫法:

           

          <bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean">

                
          <property name="jobClass">

                      
          <value>繼承QuartzJobBean的類的引用,如果不繼承QuartzJobBean可以參考 http://www.javaeye.com/topic/486055</value>

                
          </property>

          </bean>

           

          ②   用org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean指定類和方法,但是直接使用會報java.io.NotSerializableException異常,一般用網上流傳的(需要將兩個類copy到自己的工程下,要有springJAR包,Job需要持久化到數據庫中,SimpleService必須實現Serializable)frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean,可以參考: http://jira.springframework.org/browse/SPR-3797。詳細寫法:

           

          1<bean id="jobDetail1" class=" 工程里MethodInvokingJobDetailFactoryBean的路徑.MethodInvokingJobDetailFactoryBean"> 
          2        <property name="targetObject" ref="simpleService"/> 
          3        <property name="targetMethod" value="testMethod1"/> 
          4<property name="shouldRecover" value="true"/> 
          5    </bean>

           

          6、 配置到spring配置文件,自動調度任務。

           

          <context-param>  
                
          <param-name>contextConfigLocation</param-name>  
                
          <param-value>  
                      
          <!--Quartz Spring applicationContext -->  
                      WEB-INF/classes/applicationContext-quartz.xml   
                
          </param-value>  
          </context-param>

           7、 測試用例

           

          1package test;      
          2import org.springframework.context.ApplicationContext;      
          3import org.springframework.context.support.ClassPathXmlApplicationContext;      
          4public class MainTest {      
          5    public static void main(String[] args) {      
          6        ApplicationContext springContext = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext.xml","classpath:applicationContext-quartz.xml"});      
          7    }
                
          8}
          轉自:http://www.aygfsteel.com/zwzw-love/archive/2010/11/16/338182.html

          其他參考:
          http://gocom.primeton.com/modules/newbb/forumtopic19180_9963_40.htm

          評論

          # re: Quartz+Spring的集群配置(轉)  回復  更多評論   

          2014-01-04 16:38 by 333
          沖vxcxz
          主站蜘蛛池模板: 赤壁市| 珠海市| 息烽县| 博湖县| 涿州市| 鄂伦春自治旗| 吴旗县| 墨玉县| 马龙县| 库伦旗| 通榆县| 永修县| 宿迁市| 石渠县| 无为县| 图们市| 高碑店市| 兴山县| 镶黄旗| 贵溪市| 黔西县| 山西省| 楚雄市| 武城县| 华蓥市| 介休市| 昆明市| 娄底市| 屏东市| 维西| 元氏县| 荥阳市| 衡南县| 云南省| 富锦市| 梁平县| 曲阜市| 台南市| 凤台县| 英山县| 泸水县|