> 參考的優秀文章
Lesson 11: Advanced (Enterprise) Features
在許多情況,我們希望我們的定時任務是可靠的,不會因系統故障、機器宕機而導致某一筆定時任務不能按時運行。這種情況下,我們就需要為Quartz做個集群。
最簡單的情況,有兩台機器或兩個應用,同時維護一批定時任務,假如其中一個機器或應用出現問題,還有另外一個應用保底使用。
> 最簡單的集群
代碼與上一節【Quartz】將定時任務持久化到數據庫基本一致,只列出不同的代碼。
在quartz.properties配置中設置需要集群,而集群節點的ID則由quartz自動生成
org.quartz.jobStore.isClustered = true
org.quartz.scheduler.instanceId = AUTO
匯總后為
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = myDS
# Cluster
org.quartz.jobStore.isClustered = true
org.quartz.scheduler.instanceId = AUTO
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/ll?characterEncoding=utf-8
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = 123456
org.quartz.dataSource.myDS.maxConnections = 5
注:倆應用的配置應相似,除了某些特殊配置,如線程池數量、實例ID
這里啟動兩個應用,其中一個應用需要注冊定時任務(這里注冊的定時任務每30秒運行一次);另外一個應用因集群關系則無需注冊定時任務。所以,啟動類有所區別。
應用A的Bootstrap類

package No01簡單的定時任務; import java.util.concurrent.TimeUnit; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Bootstrap { private static Logger logger = LoggerFactory.getLogger(Bootstrap.class); public static void main(String[] args) { try { // 獲取Scheduler實例 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); // 具體任務 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build(); // 觸發時間點 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0,30 * * * * ? *"); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") .withSchedule(cronScheduleBuilder).build(); // 交由Scheduler安排觸發 scheduler.scheduleJob(job, trigger); try { TimeUnit.MINUTES.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } // 關閉Scheduler scheduler.shutdown(); } catch (SchedulerException se) { logger.error(se.getMessage(), se); } } }
應用B的Bootstrap類

package No01簡單的定時任務; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Bootstrap { private static Logger logger = LoggerFactory.getLogger(Bootstrap.class); public static void main(String[] args) { try { // 獲取Scheduler實例 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); } catch (SchedulerException se) { logger.error(se.getMessage(), se); } } }
現在,運行觀察是否成功。先后啟動應用A和應用B,運行並觀察一段時間后,關閉應用A,繼續觀察。
應用A的日志

23:02:44.777 [main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
23:02:44.799 [main] INFO o.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
23:02:44.800 [main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.2.1 created.
23:02:44.801 [main] INFO o.q.impl.jdbcjobstore.JobStoreTX - Using db table-based data access locking (synchronization).
23:02:44.803 [main] INFO o.q.impl.jdbcjobstore.JobStoreTX - JobStoreTX initialized.
23:02:44.804 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.1) 'MyScheduler' with instanceId 'USER-20141117SF1444316564782'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is clustered.
23:02:44.804 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
23:02:44.804 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.2.1
23:02:45.041 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' is desired by: main
23:02:45.054 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' is being obtained: main
23:02:45.059 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Inserting new lock row for lock: 'STATE_ACCESS' being obtained by thread: main
23:02:45.062 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' given to: main
23:02:45.065 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.SimpleTriggerPersistenceDelegate
23:02:45.065 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.CronTriggerPersistenceDelegate
23:02:45.067 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.CalendarIntervalTriggerPersistenceDelegate
23:02:45.068 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.DailyTimeIntervalTriggerPersistenceDelegate
23:02:45.111 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' returned by: main
23:02:45.112 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:02:45.113 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - JobStore background threads started (as scheduler was started).
23:02:45.113 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - MisfireHandler: scanning for misfires...
23:02:45.113 [main] INFO org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_USER-20141117SF1444316564782 started.
23:02:45.116 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Found 0 triggers that missed their scheduled fire-time.
23:02:45.117 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
23:02:45.122 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: main
23:02:45.122 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: main
23:02:45.123 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Inserting new lock row for lock: 'TRIGGER_ACCESS' being obtained by thread: main
23:02:45.125 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: main
23:02:45.259 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: main
23:02:45.303 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
23:02:45.800 [Timer-0] DEBUG org.quartz.utils.UpdateChecker - Checking for available updated version of Quartz...
23:02:52.613 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:00.005 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_QuartzSchedulerThread
23:03:00.005 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_QuartzSchedulerThread
23:03:00.007 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_QuartzSchedulerThread
23:03:00.061 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_QuartzSchedulerThread
23:03:00.066 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=No01簡單的定時任務.HelloJob
23:03:00.073 [MyScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
23:03:00.073 [MyScheduler_Worker-1] DEBUG No01簡單的定時任務.HelloJob - No01簡單的定時任務.HelloJob trigger...
23:03:00.076 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_Worker-1
23:03:00.077 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_Worker-1
23:03:00.081 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_Worker-1
23:03:00.144 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_Worker-1
23:03:00.146 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:00.203 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
23:03:07.625 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:15.126 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:22.745 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:30.001 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_QuartzSchedulerThread
23:03:30.002 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_QuartzSchedulerThread
23:03:30.003 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_QuartzSchedulerThread
23:03:30.056 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_QuartzSchedulerThread
23:03:30.057 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=No01簡單的定時任務.HelloJob
23:03:30.058 [MyScheduler_Worker-2] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
23:03:30.058 [MyScheduler_Worker-2] DEBUG No01簡單的定時任務.HelloJob - No01簡單的定時任務.HelloJob trigger...
23:03:30.060 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_Worker-2
23:03:30.060 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_Worker-2
23:03:30.064 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_Worker-2
23:03:30.092 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_Worker-2
23:03:30.151 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:30.210 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
23:03:37.638 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:45.113 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - MisfireHandler: scanning for misfires...
23:03:45.117 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Found 0 triggers that missed their scheduled fire-time.
23:03:45.262 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:52.673 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:00.002 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_QuartzSchedulerThread
23:04:00.003 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_QuartzSchedulerThread
23:04:00.005 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_QuartzSchedulerThread
23:04:00.061 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_QuartzSchedulerThread
23:04:00.063 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=No01簡單的定時任務.HelloJob
23:04:00.064 [MyScheduler_Worker-3] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
23:04:00.064 [MyScheduler_Worker-3] DEBUG No01簡單的定時任務.HelloJob - No01簡單的定時任務.HelloJob trigger...
23:04:00.067 [MyScheduler_Worker-3] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_Worker-3
23:04:00.067 [MyScheduler_Worker-3] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_Worker-3
23:04:00.071 [MyScheduler_Worker-3] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_Worker-3
23:04:00.163 [MyScheduler_Worker-3] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_Worker-3
23:04:00.167 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
23:04:00.168 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:07.650 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:15.267 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:22.669 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:30.002 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_QuartzSchedulerThread
23:04:30.003 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_QuartzSchedulerThread
23:04:30.005 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_QuartzSchedulerThread
23:04:30.059 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_QuartzSchedulerThread
23:04:30.061 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=No01簡單的定時任務.HelloJob
23:04:30.062 [MyScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
23:04:30.062 [MyScheduler_Worker-1] DEBUG No01簡單的定時任務.HelloJob - No01簡單的定時任務.HelloJob trigger...
23:04:30.064 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_Worker-1
23:04:30.065 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_Worker-1
23:04:30.067 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_Worker-1
23:04:30.126 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_Worker-1
23:04:30.211 [QuartzScheduler_MyScheduler-USER-20141117SF1444316564782_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:30.253 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
應用B的日志

23:02:48.737 [main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
23:02:48.763 [main] INFO o.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
23:02:48.764 [main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.2.1 created.
23:02:48.765 [main] INFO o.q.impl.jdbcjobstore.JobStoreTX - Using db table-based data access locking (synchronization).
23:02:48.767 [main] INFO o.q.impl.jdbcjobstore.JobStoreTX - JobStoreTX initialized.
23:02:48.768 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.1) 'MyScheduler' with instanceId 'USER-20141117SF1444316568742'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
Using job-store 'org.quartz.impl.jdbcjobstore.JobStoreTX' - which supports persistence. and is clustered.
23:02:48.768 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
23:02:48.768 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.2.1
23:02:48.995 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' is desired by: main
23:02:49.008 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' is being obtained: main
23:02:49.015 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' given to: main
23:02:49.018 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.SimpleTriggerPersistenceDelegate
23:02:49.019 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.CronTriggerPersistenceDelegate
23:02:49.020 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.CalendarIntervalTriggerPersistenceDelegate
23:02:49.021 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Adding TriggerPersistenceDelegate of type: org.quartz.impl.jdbcjobstore.DailyTimeIntervalTriggerPersistenceDelegate
23:02:49.084 [main] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' returned by: main
23:02:49.087 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:02:49.088 [main] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - JobStore background threads started (as scheduler was started).
23:02:49.088 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - MisfireHandler: scanning for misfires...
23:02:49.089 [main] INFO org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_USER-20141117SF1444316568742 started.
23:02:49.097 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Found 0 triggers that missed their scheduled fire-time.
23:02:49.100 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
23:02:49.764 [Timer-0] DEBUG org.quartz.utils.UpdateChecker - Checking for available updated version of Quartz...
23:02:56.568 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:04.064 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:11.573 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:13.468 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
23:03:19.075 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:26.625 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:34.086 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:40.882 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
23:03:41.584 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:49.088 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - MisfireHandler: scanning for misfires...
23:03:49.090 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Found 0 triggers that missed their scheduled fire-time.
23:03:49.095 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:03:56.586 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:03.918 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
23:04:04.095 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:11.606 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:19.100 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:26.618 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:33.846 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
23:04:34.103 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:41.604 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:49.089 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - MisfireHandler: scanning for misfires...
23:04:49.092 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_MisfireHandler] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - Found 0 triggers that missed their scheduled fire-time.
23:04:49.104 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' is desired by: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.104 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' is being obtained: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.105 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' given to: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.107 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.108 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.109 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.109 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] INFO o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: detected 1 failed or restarted instances.
23:04:49.109 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] INFO o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Scanning for instance "USER-20141117SF1444316564782"'s failed in-progress jobs.
23:04:49.119 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] INFO o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: ......Freed 1 acquired trigger(s).
23:04:49.120 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: ......Deleted 0 complete triggers(s).
23:04:49.120 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: ......Scheduled 0 recoverable job(s) for recovery.
23:04:49.120 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: ......Cleaned-up 0 other failed job(s).
23:04:49.187 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.187 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'STATE_ACCESS' returned by: QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager
23:04:49.188 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:04:49.245 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
23:04:56.620 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:05:00.003 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_QuartzSchedulerThread
23:05:00.004 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_QuartzSchedulerThread
23:05:00.006 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_QuartzSchedulerThread
23:05:00.063 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_QuartzSchedulerThread
23:05:00.069 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=No01簡單的定時任務.HelloJob
23:05:00.076 [MyScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
23:05:00.076 [MyScheduler_Worker-1] DEBUG No01簡單的定時任務.HelloJob - No01簡單的定時任務.HelloJob trigger...
23:05:00.080 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_Worker-1
23:05:00.081 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_Worker-1
23:05:00.083 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_Worker-1
23:05:00.146 [MyScheduler_Worker-1] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_Worker-1
23:05:00.215 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
23:05:04.106 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:05:11.617 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:05:19.117 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:05:26.651 [QuartzScheduler_MyScheduler-USER-20141117SF1444316568742_ClusterManager] DEBUG o.q.impl.jdbcjobstore.JobStoreTX - ClusterManager: Check-in complete.
23:05:30.001 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_QuartzSchedulerThread
23:05:30.002 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_QuartzSchedulerThread
23:05:30.003 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_QuartzSchedulerThread
23:05:30.057 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_QuartzSchedulerThread
23:05:30.058 [MyScheduler_QuartzSchedulerThread] DEBUG o.q.simpl.PropertySettingJobFactory - Producing instance of Job 'group1.job1', class=No01簡單的定時任務.HelloJob
23:05:30.058 [MyScheduler_Worker-2] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.job1
23:05:30.059 [MyScheduler_Worker-2] DEBUG No01簡單的定時任務.HelloJob - No01簡單的定時任務.HelloJob trigger...
23:05:30.060 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is desired by: MyScheduler_Worker-2
23:05:30.060 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: MyScheduler_Worker-2
23:05:30.061 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' given to: MyScheduler_Worker-2
23:05:30.124 [MyScheduler_Worker-2] DEBUG o.q.i.j.StdRowLockSemaphore - Lock 'TRIGGER_ACCESS' returned by: MyScheduler_Worker-2
23:05:30.183 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
通過日志觀察可見,首先定時任務有應用A執行,在應用A被關閉后,定時任務由應用B繼續觸發執行。
注:這里觀察到,似乎不是負載均衡,因為在應用A關閉后應用B才有機會運行。而我們理想中,應該是應用A與應用B互相補充、交替運行。這里主要因為只用了一個任務(只有一個觸發器)做測試,如果運用多個觸發器設置多個任務做測試,應用A與應用B互相補充、交替運行。原文為:
The load balancing mechanism is near-random for busy schedulers (lots of triggers) but favors the same node that just was just active for non-busy (e.g. one or two triggers) schedulers.