您的位置:首页 > 其它

【Quartz】配置最简单的集群

2015-10-09 00:04 585 查看

> 参考的优秀文章

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类

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


View Code
通过日志观察可见,首先定时任务有应用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.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: