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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

dataConfig.properties:




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:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

4、 配置applicationContext-quartz.xml

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

5、 配置Job任務(wù)注意:加入定時任務(wù)有兩種方式:
① 繼承QuartzJobBean的類,重寫executeInternal(),詳細寫法:









② 用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。詳細寫法:

2

3

4

5

6、 配置到spring配置文件,自動調(diào)度任務(wù)。







7、 測試用例

2

3

4

5

6

7

8

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