隨筆 - 12  文章 - 20  trackbacks - 0
          <2010年11月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

                 原來配置的Quartz是通過spring配置文件生效的,發(fā)現(xiàn)在非集群式的服務(wù)器上運行良好,但是將工程部署到水平集群服務(wù)器上去后改定時功能不能正常運行,沒有任何錯誤日志,于是從jar包、JDK版本、cronExpression到服務(wù)器類型,甚至查到了服務(wù)器操作系統(tǒng)的類型,都沒能找到解決的辦法,后來才知道是集群惹的禍!

                   詳細步驟如下:

          1、  按照Quartz集群工作原理

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

           

          在數(shù)據(jù)庫中建表。建表模版在Quartz包下docs/dbTables下,選擇相應(yīng)的數(shù)據(jù)庫和版本即可。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、 配置數(shù)據(jù)庫連接池,如果spring已經(jīng)配置則不需要再另行配置,只需在后面配置的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 中來唯一標識實例,但是所有集群節(jié)點中必須相同。
          org.quartz.scheduler.instanceId 屬性為 AUTO即可,基于主機名和時間戳來產(chǎn)生實例 ID。
          org.quartz.jobStore.class屬性為 JobStoreTX,將任務(wù)持久化到數(shù)據(jù)中。因為集群中節(jié)點依賴于數(shù)據(jù)庫來傳播 Scheduler 實例的狀態(tài),你只能在使用 JDBC JobStore 時應(yīng)用 Quartz 集群。這意味著你必須使用 JobStoreTX 或是 JobStoreCMT 作為 Job 存儲;你不能在集群中使用 RAMJobStore。
          org.quartz.jobStore.isClustered 屬性為 true,你就告訴了 Scheduler 實例要它參與到一個集群當中。這一屬性會貫穿于調(diào)度框架的始終,用于修改集群環(huán)境中操作的默認行為。
          org.quartz.jobStore.clusterCheckinInterval 屬性定義了Scheduler 實例檢入到數(shù)據(jù)庫中的頻率(單位:毫秒)。Scheduler 檢查是否其他的實例到了它們應(yīng)當檢入的時候未檢入;這能指出一個失敗的 Scheduler 實例,且當前 Scheduler 會以此來接管任何執(zhí)行失敗并可恢復(fù)的 Job。通過檢入操作,Scheduler 也會更新自身的狀態(tài)記錄。clusterChedkinInterval 越小,Scheduler 節(jié)點檢查失敗的 Scheduler 實例就越頻繁。默認值是 15000 (即15 秒)。

          quartz.properties:

           

           1##Quartz 調(diào)度任務(wù)所需的配置文件   
           2
            
           3
          ##org.quartz.scheduler.instanceName屬性可為任何值,用在 JDBC JobStore 中來唯一標識實例,但是所有集群節(jié)點中必須相同。   
           4org.quartz.scheduler.instanceName =
           HumsScheduler         
           5
          ##org.quartz.scheduler.instanceId 屬性為 AUTO即可,基于主機名和時間戳來產(chǎn)生實例 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,將任務(wù)持久化到數(shù)據(jù)中。   
          15
           ##因為集群中節(jié)點依賴于數(shù)據(jù)庫來傳播 Scheduler 實例的狀態(tài),你只能在使用 JDBC JobStore 時應(yīng)用 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
          ##這一屬性會貫穿于調(diào)度框架的始終,用于修改集群環(huán)境中操作的默認行為。   
          23org.quartz.jobStore.isClustered =
           true        
          24
          ##org.quartz.jobStore.clusterCheckinInterval 屬性定義了Scheduler 實例檢入到數(shù)據(jù)庫中的頻率(單位:毫秒)。   
          25
          ##Scheduler 檢查是否其他的實例到了它們應(yīng)當檢入的時候未檢入;這能指出一個失敗的 Scheduler 實例,且當前 Scheduler 會以此來接管任何執(zhí)行失敗并可恢復(fù)的 Job。   
          26##通過檢入操作,Scheduler 也會更新自身的狀態(tài)記錄。clusterChedkinInterval 越小,Scheduler 節(jié)點檢查失敗的 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"/>  <!--數(shù)據(jù)源引用指向,包含集群所需的所有表-->
            
           8        </property>
                 
           9        <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
               
          10<!--applicationContextSchedulerContextKey: 是org.springframework.scheduling.quartz.SchedulerFactoryBean這個類中把spring上下 文以key/value的方式存放在了quartz的上下文中了,可以用applicationContextSchedulerContextKey所定義的key得到對應(yīng)的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任務(wù)注意:加入定時任務(wù)有兩種方式:

          ①     繼承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異常,一般用網(wǎng)上流傳的(需要將兩個類copy到自己的工程下,要有springJAR包,Job需要持久化到數(shù)據(jù)庫中,SimpleService必須實現(xiàn)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配置文件,自動調(diào)度任務(wù)。

           

          <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}

           

          本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/liaowu010/archive/2010/08/31/5853683.aspx

          posted on 2010-11-16 15:32 沖出銀河系 閱讀(4754) 評論(0)  編輯  收藏 所屬分類: spring

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 阳东县| 抚顺市| 谷城县| 上饶县| 扎赉特旗| 霞浦县| 霍州市| 南木林县| 灌南县| 南华县| 邹城市| 凌源市| 班玛县| 婺源县| 克拉玛依市| 平原县| 安塞县| 沭阳县| 卢氏县| 谢通门县| 大化| 台东县| 阿克| 疏勒县| 宝鸡市| 青河县| 申扎县| 贵定县| 太和县| 德令哈市| 同心县| 东乡县| 杭锦后旗| 普安县| 浦县| 确山县| 中西区| 连平县| 道真| 宝清县| 丹江口市|