Quartz+Spring的集羣配置

原來配置的Quartz是經過spring配置文件生效的,發如今非集羣式的服務器上運行 良好,可是將工程部署到水平集羣服務器上去後改定時功能不能正常運行,沒有任何錯誤日誌,因而從jar包、JDK版本、cronExpression到服 務器類型,甚至查到了服務器操做系統的類型,都沒能找到解決的辦法,後來才知道是集羣惹的禍! html

        詳細步驟以下:java

一、 按照Quartz集羣工做原理spring

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

 

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

QRTZ_JOB_LISTENERS服務器

QRTZ_TRIGGER_LISTENERSapp

QRTZ_FIRED_TRIGGERS框架

QRTZ_PAUSED_TRIGGER_GRPS測試

QRTZ_SCHEDULER_STATEurl

QRTZ_LOCKS

QRTZ_SIMPLE_TRIGGERS

QRTZ_CRON_TRIGGERS

QRTZ_TRIGGERS

QRTZ_JOB_DETAILS

QRTZ_CALENDARS

QRTZ_BLOB_TRIGGERS

二、 配置數據庫鏈接池,若是spring已經配置則不須要再另行配置,只需在後面配置的applicationContext-quartz.xml引入便可。

applicationContext.xml:

 

 <bean id="propertyConfigurer"  
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  
            <property name="location">
  
           <value>classpath:dataConfig.properties</value>
  
            </property>
  
 </bean>
  
      <bean id="ds34" class="org.apache.commons.dbcp.BasicDataSource"
  
            destroy-method="close">
  
            <property name="driverClassName">
  
                 <value>${ds34.driver}</value>
  
           </property>
  
           <property name="url">
  
                 <value>${ds34.url}</value>
  
           </property>
  
           <property name="username">
  
                 <value>${ds34.username}</value>
  
           </property>
  
           <property name="password">
  
                 <value>${ds34.password}</value>
  
           </property>
  
           <property name="maxActive" value="5"></property>
  
           <property name="maxIdle" value="20"></property>
  
           <property name="maxWait" value="50"></property>
  
           <property name="defaultAutoCommit" value="true"></property>
  
</bean>  

 

dataConfig.properties:

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

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

三、 配置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:

 

 ##Quartz 調度任務所需的配置文件   
 
  
 
##org.quartz.scheduler.instanceName屬性可爲任何值,用在 JDBC JobStore 中來惟一標識實例,可是全部集羣節點中必須相同。   
 org.quartz.scheduler.instanceName =
 HumsScheduler         
 
##org.quartz.scheduler.instanceId 屬性爲 AUTO便可,基於主機名和時間戳來產生實例 ID。   
 org.quartz.scheduler.instanceId =
 AUTO        
 
     
 orgorg.quartz.threadPool.class =
 org.quartz.simpl.SimpleThreadPool       
 org.quartz.threadPool.threadCount = 10
       
org.quartz.threadPool.threadPriority = 5
       
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread =
 true      
    
org.quartz.jobStore.misfireThreshold = 60000
      
 ##org.quartz.jobStore.class屬性爲 JobStoreTX,將任務持久化到數據中。   
 ##由於集羣中節點依賴於數據庫來傳播 Scheduler 實例的狀態,你只能在使用 JDBC JobStore 時應用 Quartz 集羣。   
 ##這意味着你必須使用 JobStoreTX 或是 JobStoreCMT 做爲 Job 存儲;你不能在集羣中使用 RAMJobStore。   
orgorg.quartz.jobStore.class =
 org.quartz.impl.jdbcjobstore.JobStoreTX       
orgorg.quartz.jobStore.driverDelegateClass=
org.quartz.impl.jdbcjobstore.StdJDBCDelegate       
org.quartz.jobStore.tablePrefix =
 QRTZ_       
org.quartz.jobStore.maxMisfiresToHandleAtATime=10
       
##org.quartz.jobStore.isClustered 屬性爲 true,你就告訴了 Scheduler 實例要它參與到一個集羣當中。   
##這一屬性會貫穿於調度框架的始終,用於修改集羣環境中操做的默認行爲。   
org.quartz.jobStore.isClustered =
 true        
##org.quartz.jobStore.clusterCheckinInterval 屬性定義了Scheduler 實例檢入到數據庫中的頻率(單位:毫秒)。   
##Scheduler 檢查是否其餘的實例到了它們應當檢入的時候未檢入;這能指出一個失敗的 Scheduler 實例,且當前 Scheduler 會以此來接管任何執行失敗並可恢復的 Job。   
##經過檢入操做,Scheduler 也會更新自身的狀態記錄。clusterChedkinInterval 越小,Scheduler 節點檢查失敗的 Scheduler 實例就越頻繁。默認值是 15000
 (即15 秒)。   
org.quartz.jobStore.clusterCheckinInterval = 20000

四、 配置applicationContext-quartz.xml

 

 <?xml version="1.0" encoding="UTF-8"?>       
 
  
 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
       
 <beans>
       
     <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       
         <property name="dataSource">
       
             <ref bean="ds34"/>  <!--數據源引用指向,包含集羣所需的全部表-->
  
         </property>
       
         <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
     
<!--applicationContextSchedulerContextKey: 是 org.springframework.scheduling.quartz.SchedulerFactoryBean這個類中把spring上 下 文以key/value的方式存放在了quartz的上下文中了,能夠用 applicationContextSchedulerContextKey所定義的key獲得對應的spring上下文-->
  
        <property name="configLocation" value="classpath:quartz.properties"/>
      
<!--configLocation:用於指明quartz的配置文件的位置 -->
    
      <property name="triggers">
       
            <list>
         
                  <ref bean="trigger1"/>
       
            </list>
       
      </property>
       
    </bean>
      
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean">
  
      <property name="jobClass">
  
            <value>繼承QuartzJobBean的類的引用,若是不繼承QuartzJobBean能夠參考 http://www.javaeye.com/topic/486055</value>
  
      </property>
  
</bean>
  
    <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerBean">
       
        <property name="jobDetail" ref="jobDetail1"/>
       
        <property name="cronExpression" value="0 0/5 * ? * * *"/>
       
<!—cronExpression 表達式 -->
  
    </bean>
          
</beans>

 

  五、 配置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。詳細寫法:

 

<bean id="jobDetail1" class=" 工程裏MethodInvokingJobDetailFactoryBean的路徑.MethodInvokingJobDetailFactoryBean"> 
        <property name="targetObject" ref="simpleService"/> 
        <property name="targetMethod" value="testMethod1"/> 
<property name="shouldRecover" value="true"/> 
    </bean>

 

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

 

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

 七、 測試用例

 

package test;      
import org.springframework.context.ApplicationContext;      
import org.springframework.context.support.ClassPathXmlApplicationContext;      
public class MainTest {      
    public static void main(String[] args) {      
      ApplicationContext springContext = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext.xml","classpath:applicationContext-quartz.xml"});      
   }
      
}

轉自:http://www.blogjava.net/zwzw-love/archive/2010/11/16/338182.html

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

相關文章
相關標籤/搜索