原來配置的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