浅析Quartz的集群配置(一)
收藏人:Rozdy    
2015-01-13 | 阅:1  转:22  
 |   来源
  |  分享 
 
 
 
  
 
 

1 基本信息

摘要:Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。其中集群配置一般比较复杂,那么在Quartz中如何配置它的集群特性呢?

作者:武玉厚

查看本文第二部分:http://gocom.primeton.com/modules/newbb/forumtopic19180_9963_40.htm

2 Quartz的集群配置

  Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。其中集群配置一般比较复杂,那么在Quartz中如何配置它的集群特性呢?

2.1 实现集群的基本原理

  目前Quartz最新版本是1.6.0。Quartz是通过借助关系数据库和JDBC作业存储来实现集群管理的。


 
1. 原理

  集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。目前集群只能工作在JDBC-Jobstore (JobStoreTX 或者JobStoreCMT)方式下,从本质上来说,是使集群上的每一个节点通过共享同一个数据库来工作的(Quartz通过启动两个维护线程来维护数据库状态实现集群管理,一个是检测节点状态线程,一个是恢复任务线程)。

  负载平衡是自动完成的,集群的每个节点会尽快触发任务。当一个触发器的触发时间到达时,第一个节点将会获得任务(通过锁定),成为执行任务的节点。

  故障切换的发生是在当一个节点正在执行一个或者多个任务失败的时候。当一个节点失败了,其他的节点会检测到并且标识在失败节点上正在进行的数据库中的任务。任何被标记为可恢复(任务详细信息的"requests recovery"属性)的任务都会被其他的节点重新执行。没有标记可恢复的任务只会被释放出来,将会在下次相关触发器触发时执行。

2. 集群管理用到的表

--任务详细信息表

  1. CREATE TABLE qrtz_job_details
  2. (
  3. JOB_NAME VARCHAR2(80) NOT NULL,
  4. JOB_GROUP VARCHAR2(80) NOT NULL,
  5. DESCRIPTION VARCHAR2(120) NULL,
  6. JOB_CLASS_NAME VARCHAR2(128) NOT NULL,
  7. IS_DURABLE VARCHAR2(1) NOT NULL,
  8. IS_VOLATILE VARCHAR2(1) NOT NULL,
  9. IS_STATEFUL VARCHAR2(1) NOT NULL,
  10. REQUESTS_RECOVERY VARCHAR2(1) NOT NULL, --可恢复标记
  11. JOB_DATA BLOB NULL,
  12. PRIMARY KEY (JOB_NAME,JOB_GROUP)
  13. );

--触发器与任务关联表

  1. CREATE TABLE qrtz_fired_triggers
  2. (
  3. ENTRY_ID VARCHAR2(95) NOT NULL,
  4. TRIGGER_NAME VARCHAR2(80) NOT NULL,
  5. TRIGGER_GROUP VARCHAR2(80) NOT NULL,
  6. IS_VOLATILE VARCHAR2(1) NOT NULL,
  7. INSTANCE_NAME VARCHAR2(80) NOT NULL,
  8. FIRED_TIME NUMBER(13) NOT NULL,
  9. STATE VARCHAR2(16) NOT NULL,
  10. JOB_NAME VARCHAR2(80) NULL,
  11. JOB_GROUP VARCHAR2(80) NULL,
  12. IS_STATEFUL VARCHAR2(1) NULL,
  13. REQUESTS_RECOVERY VARCHAR2(1) NULL, --可恢复标记
  14. PRIMARY KEY (ENTRY_ID)
  15. );

--调度器状态表

  1. TABLE qrtz_scheduler_state
  2. (
  3. INSTANCE_NAME VARCHAR2(80) NOT NULL, --调度器实例ID
  4. LAST_CHECKIN_TIME NUMBER(13) NOT NULL, --上次检查时间
  5. CHECKIN_INTERVAL NUMBER(13) NOT NULL, --检查时间间隔
  6. RECOVERER VARCHAR2(80) NULL, --恢复调度器
  7. PRIMARY KEY (INSTANCE_NAME)
  8. );

2.2 集群配置

  通过设置"org.quartz.jobStore.isClustered"属性为"true"来激活集群特性。在集群中的每一个实例都必须有一个唯一的"instance id" ("org.quartz.scheduler.instanceId" 属性), 但是应该有相同的"scheduler instance name" ("org.quartz.scheduler.instanceName"),也就是说集群中的每一个实例都必须使用相同的quartz.properties 配置文件。除了以下几种例外,配置文件的内容其他都必须相同:

? 不同的线程池大小,
? 不同的"org.quartz.scheduler.instanceId"属性值(这个可以很容易做到,设定为"AUTO"即可)。
? 注意: 永远不要在不同的机器上运行集群,除非他们的时钟是使用某种形式的同步服务(守护)非常有规律的运行(时钟必须在一分一秒内)来达到同步。还有: 永远不要触发一个非集群的实例,如果其他的实例正在同一个数据库表上运行。你将使你的数据严重腐蚀,出现非预期行为。
? 示例及详细配置说明,请参照附录Quartz配置文件说明。

3 附录

3.1 Quartz配置文件说明

3.1.1 Quartz配置文件基本说明

  文件名称:默认文件名称quartz.properties,可以通过更改系统属性“org.quartz.properties”来加载自定义的配置。
  格式:属性文件

3.1.2 Quartz配置文件详细说明

3.1.2.1 Scheduler主要属性的配置

  1. # Scheduler主要属性的一般定义模式如下:
  2. #
  3. # org.quartz.scheduler.instanceName = SCHED_NAME
  4. # org.quartz.scheduler.instanceId = INSTANCE_ID
  5. # org.quartz.scheduler.threadName = THREAD_NAME
  6. # org.quartz.scheduler.rmi.export = false
  7. # org.quartz.scheduler.rmi.proxy = false
  8. # org.quartz.scheduler.rmi.registryHost = localhost
  9. # org.quartz.scheduler.rmi.registryPort = 1099
  10. # org.quartz.scheduler.rmi.createRegistry = never
  11. # org.quartz.scheduler.userTransactionURL = USER_TX_LOCATION
  12. # org.quartz.scheduler.wrapJobExecutionInUserTransaction = JOBS_IN_USER_TX
  13. # org.quartz.scheduler.idleWaitTime = IDLE_WAIT_TIME
  14. # org.quartz.scheduler.dbFailureRetryInterval = DB_FAILURE_RETRY_INTERVAL
  15. # org.quartz.scheduler.classLoadHelper.class = CLASS_LOAD_HELPER_CLASS
  16. # org.quartz.context.key.SOME_KEY = SOME_VALUE

下面是具体说明:



3.1.2.2 线程池(ThreadPool)的配置

下面是具体说明:

  1. # 定制一个线程池的一般模式如下:
  2. #
  3. # org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
  4. # org.quartz.threadPool.threadCount = THREAD_COUNT
  5. # org.quartz.threadPool.threadPriority = THREAD_PRIO
  6. #
  7. # 简单线程池(SimpleThreadPool)的选项参数:
  8. #
  9. # org.quartz.threadPool.makeThreadsDaemons = DAEMON_THREADS
  10. # org.quartz.threadPool.threadsInheritGroupOfInitializingThread = INHERIT_GRP
  11. # org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = INHERIT_LDR
  12. #
  13. # or
  14. #
  15. # org.quartz.threadPool.class = com.mycompany.goo.FooThreadPool
  16. # org.quartz.threadPool.somePropOfFooThreadPool = someValue
  17. #

浅析Quartz的集群配置的更多相关文章

  1. quartz做集群配置较短的时间间隔会重复执行任务的问题

    quartz.properties org.quartz.jobStore.misfireThreshold = 60000 这个参数(单位为毫秒)设置了以后就是超时1min的就不执行,小于1min会 ...

  2. 定时组件quartz系列<二>quartz的集群原理

    1.基本信息:      Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或 ...

  3. Spring+quartz 实现定时任务job集群配置

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  4. Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群

    Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...

  5. Spring+quartz 实现定时任务job集群配置【原】

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  6. 【淘淘】Quartz之集群利弊

    一.前言: 虽然单个Quartz实例能给予我们很好的任务job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成 ...

  7. 基于redis的cas集群配置(转)

    1.cas ticket统一存储 做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致.官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方 ...

  8. 基于redis的cas集群配置

    1.cas ticket统一存储 做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致.官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方 ...

  9. 浅析Linux服务器集群系统技术

    浅析Linux服务器集群系统技术 目录 前言 常用的服务器集群 集群系统的优势 LVS集群的通用体系结构 为什么使用层次的体系结构 为什么是共享存储 可伸缩Web服务 前言 总结两篇技术文章,努力学习 ...

随机推荐

  1. Django之Model(一)--基础篇

    0.数据库配置 django默认支持sqlite,mysql, oracle,postgresql数据库.Django连接数据库默认编码使用UTF8,使用中文不需要特别设置. sqlite djang ...

  2. WPF之旅(一)- 概述

    WPF与之前出现的其他技术相比引入了“内置硬件加速”和“分辨率无关”等创新功能.WPF是一种成熟的技术,它是几个已经发布的.NET平台的一部分,并通过几个版本不断地进行完善(WPF3.0 -> ...

  3. WPF 控件截图位置不正确的问题

    用WPF的RenderTargetBitmap可以截取控件内容到一张图片上,但是实际使用的时候经常出现截取的位置不正确的问题.今天是第二次解决这个问题,所以记录下,免得再忘了. RenderTarge ...

  4. MyEclipse管理部署Maven项目 供调试

    今天对Maven的一个项目弄到头大,用MyEclipse10.x做了半天都没有部署成功. 后来发现用maven自己的maven4myelipse插件配置一下Goals:tomcat:run就好了,其他 ...

  5. AnyChartStock去除水印方法

    最近在使用AnyChartStock的图表,功能很强大,但下载过来是有水印的,虽然网上也有很多破解无水印的版本,但基本都是AnyChart的,AnyChartStoc的几乎没有.所以自己尝试着去除水印 ...

  6. 如何设置让SFTP的用户限制在某个目录下

    通常SFTP的任何用户登录之后能看到整个系统的文件目录,这样很不安全. 通过chroot我们可以将某个用户登录SFTP后只能在某个限定的目录下操作,这样可以更安全.我们来看看怎么设置. 1.创建一个用 ...

  7. php获取指定日期所在星期的开始时间与结束时间

    function getWeekRange($date){    $ret=array();    $timestamp=strtotime($date);    $w=strftime('%u',$ ...

  8. iOS 10 因苹果健康导致闪退 crash-b

    如果在app中调用了苹果健康,iOS10中会出现闪退.控制台报出的原因是: Terminating app due to uncaught exception 'NSInvalidArgumentEx ...

  9. 消息传递选择:返回值 or 抛出异常

    1.返回值 bool 不应该用来表示函数是否调用成功,而应该返回业务值,例如 IsExist,HasNext

  10. ios Camera学习笔记

    检测设备的摄像头是否可用: - (BOOL) isCameraAvailable{ return [UIImagePickerController isSourceTypeAvailable: UII ...