• [转载]Quartz的集群配置


    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作业存储来实现集群管理的。

    Quartz的集群配置 - 小强  - 奋斗,成长

    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

    下面是具体说明:

    Quartz的集群配置 - 小强  - 奋斗,成长
    Quartz的集群配置 - 小强  - 奋斗,成长
    Quartz的集群配置 - 小强  - 奋斗,成长

    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的集群配置 - 小强  - 奋斗,成长

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

    引用:http://gocom.primeton.com/modules/newbb/item43467_43467.htm?referer=csdn&utm_campaign=gocomoncsdn&utm_source=csdn&utm_medium=csdnzone

    基本信息

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

    作者:武玉厚

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

    3.1.2.3 任务存储(JobStore)的配置




    1. #
    2. # 定义一个任务存储的一般模式如下:
    3. #
    4. # org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
    5. # org.quartz.jobStore.misfireThreshold = MISFIRE_THRESHOLD
    6. #
    7. # or
    8. #
    9. # org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.<JobStoreClass>
    10. # JobStoreClass 是下面其中的一个:
    11. # - JobStoreTX 用于单机(standalone-Quartz)实现
    12. # - JobStoreCMT 用于基于应用服务器容器管理事务(appserver-based container-managed transaction )的Quartz 实现
    13. #
    14. # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.<DriverDelegateClass>
    15. # DriverDelegateClass 是下面其中的一个:
    16. # - StdJDBCDelegate (用于许多 JDBC-compliant drivers)
    17. # - MSSQLDelegate (用于 Microsoft SQL Server drivers)
    18. # - PostgreSQLDelegate (用于 PostgreSQL drivers)
    19. # - WebLogicDelegate (用于 WebLogic drivers)
    20. # - oracle.OracleDelegate (用于 Oracle drivers)
    21. #
    22. # org.quartz.jobStore.useProperties = USE_PROPERTIES
    23. # org.quartz.jobStore.dataSource = DS_NAME
    24. # org.quartz.jobStore.tablePrefix = TABLE_PREFIX
    25. # org.quartz.jobStore.isClustered = IS_CLUSTERED
    26. # org.quartz.jobStore.selectWithLockSQL = LOCKING_SELECT_STATEMENT
    27. # org.quartz.jobStore.dontSetAutoCommitFalse = DONT_TURN_OFF_AUTO_COMMIT
    28. # org.quartz.jobStore.maxMisfiresToHandleAtATime = MAX_MISFIRE_HANDLE
    29. # org.quartz.jobStore.txIsolationLevelSerializable = SERIALIZABLE_ISOLATION
    30. #
    31. # 如果你使用JobStoreCMT,你还需要下面的参数:
    32. #
    33. # org.quartz.jobStore.nonManagedTXDataSource = NON_MANAGED_TX_DS_NAME
    34. #
    35. # 并且如果你使用JobStoreCMT,下面的参数是可选的:
    36. #
    37. # org.quartz.jobStore.dontSetNonManagedTXConnectionAutoCommitFalse = DONT_TURN_OFF_AUTO_COMMIT
    38. # org.quartz.jobStore.txIsolationLevelReadCommitted = READ_COMMITTED_ISOLATION
    39. #
    40. #
    41. # 或者,使用一个用户自定义JobStore实现:
    42. #
    43. # org.quartz.jobStore.class = com.mycompany.goo.FooJobStore
    44. # org.quartz.jobStore.somePropOfFooJobStore = someValue
    45. #
    46. #


    下面是具体说明:

    3.1.2.4 数据源的配置

     

    1. # (只有当使用JDBCJobStore时需要, 或者一个插件需要JDBC)
    2. # -- 如果你的Scheduler非常忙碌,比如在一定的线程池内执行相同数目的任务,那么你应让数据源的连接数等于线程数 + 1
    3. #
    4. # 数据源定义的一般模式如下:
    5. #
    6. # org.quartz.dataSource.NAME.driver = DRIVER_CLASS_NAME
    7. # org.quartz.dataSource.NAME.URL = DB_URL
    8. # org.quartz.dataSource.NAME.user = DB_USER
    9. # org.quartz.dataSource.NAME.password = DB_PASSWORD
    10. # org.quartz.dataSource.NAME.maxConnections = DB_POOL_SIZE
    11. # org.quartz.dataSource.NAME.validationQuery= VALIDATION_QUERY
    12. #
    13. # or
    14. #
    15. # org.quartz.dataSource.NAME.jndiURL = DB_JNDI_URL
    16. #
    17. # or
    18. # org.quartz.dataSource.NAME.jndiURL = DB_JNDI_URL
    19. # org.quartz.dataSource.NAME.jndiAlwaysLookup = DB_JNDI_ALWAYS_LOOKUP
    20. # org.quartz.dataSource.NAME.java.naming.factory.initial = JNDI_CTXT_FACTORY
    21. # org.quartz.dataSource.NAME.java.naming.provider.url = JNDI_PROVIDER_URL
    22. # org.quartz.dataSource.NAME.java.naming.security.principal = JNDI_PRINCIPAL
    23. # org.quartz.dataSource.NAME.java.naming.security.credentials = JNDI_CREDENTIALS
    24. #
    25. #


    上面显示了两种数据源定义方式:一个数据源可以用给定的数据库连接信息创建,也可以是利用应用服务器管理生成的JNDI数据源的逻辑映射。
    下面是具体说明:


    3.1.2.5 Scheduler插件的配置

     

    1. # SchedulerPlugin定义的一般模式如下:
    2. #
    3. # org.quartz.plugin.NAME.class = PLUGIN_CLASS_NAME
    4. #
    5. # 如果这个插件类有一些属性值需要通过"setter"方法设定, 名称和值的属性定义如下:
    6. #
    7. # org.quartz.plugin.NAME.propName = propValue
    8. #
    9. # ..."propName" 在插件类中会有一个"setPropName"方法.但是只支持原始数据类型(包括 Strings)。
    10. #

    配置插件的简单示例:

    1. org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin
    2. org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
    3. org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}
    4.  
    5. org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
    6. org.quartz.plugin.jobInitializer.fileName = data/my_job_data.xml
    7. org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
    8. org.quartz.plugin.jobInitializer.failOnFileNotFound = true
    9.  
    10. org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
    11. org.quartz.plugin.shutdownhook.cleanShutdown = true

    3.1.3 示例

    1. #============================================================
    2. # Configure Main Scheduler Properties
    3. #===========================================================
    4.  
    5. org.quartz.scheduler.instanceName = MyClusteredScheduler
    6. org.quartz.scheduler.instanceId = AUTO
    7.  
    8. #===========================================================
    9. # Configure ThreadPool
    10. #===========================================================
    11.  
    12. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    13. org.quartz.threadPool.threadCount = 25
    14. org.quartz.threadPool.threadPriority = 5
    15.  
    16. #===========================================================
    17. # Configure JobStore
    18. #===========================================================
    19.  
    20. org.quartz.jobStore.misfireThreshold = 60000
    21.  
    22. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    23. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
    24. org.quartz.jobStore.useProperties = false
    25. org.quartz.jobStore.dataSource = myDS
    26. org.quartz.jobStore.tablePrefix = QRTZ_
    27.  
    28. org.quartz.jobStore.isClustered = true
    29. org.quartz.jobStore.clusterCheckinInterval = 20000
    30.  
    31. #===========================================================
    32. # Configure Datasources
    33. #===========================================================
    34.  
    35. org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver
    36. org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@cluster:1521:dev
    37. org.quartz.dataSource.myDS.user = quartz
    38. org.quartz.dataSource.myDS.password = quartz
    39. org.quartz.dataSource.myDS.maxConnections = 5
    40. org.quartz.dataSource.myDS.validationQuery=select 0 from dual

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

  • 相关阅读:
    写给QA/软件测试新人
    互联网产品线上故障管理规范
    爬了世纪佳缘后发现了一个秘密,世纪佳缘找对象靠谱吗?
    网传美团今年应届生年薪 35w+,严重倒挂老员工,为什么互联网大厂校招的薪资一年比一年高?...
    MySQL大表优化方案
    步入AI领域2年连升3级,我只是找对了学习方法而已……
    BZOJ 4008 亚瑟王(概率DP 奥妙重重)
    BZOJ 4318 OSU! (概率DP)
    BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
    BZOJ 4145 [AMPPZ2014]The Prices (状压DP)
  • 原文地址:https://www.cnblogs.com/hehexiaoxia/p/3066629.html
Copyright © 2020-2023  润新知