quartz 分布式_Quartz集群原理以及配置应用的方法详解

Quartz是Java的开源任务调度工具,具备强大的调度功能和分布式能力。核心元素包括Scheduler、Trigger和Job,支持多种触发器类型。在集群环境中,Quartz通过共享数据库存储任务和触发器,实现节点间的状态感知和故障恢复。每个节点通过定时检入来检测集群状态,当节点失败时,其他节点能接管并执行失败节点的任务。
摘要由CSDN通过智能技术生成

Quartz是Java领域最著名的开源任务调度工具。Quartz提供了极为广泛的特性如持久化任务,集群和分布式任务等,下面这篇文章主要给大家介绍了关于Quartz集群原理以及配置应用的相关资料,需要的朋友可以参考下

1、Quartz任务调度的基本实现原理

Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现。作为一个优秀的开源调度框架,Quartz具有以下特点:

    (1)强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;

    (2)灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;

    (3)分布式和集群能力,Terracotta收购后在原来功能基础上作了进一步提升。本文将对该部分相加阐述。

1.1 Quartz 核心元素

Quartz任务调度的核心元素为:Scheduler——任务调度器、Trigger——触发器、Job——任务。其中trigger和job是任务调度的元数据,scheduler是实际执行调度的控制器。

Trigger是用于定义调度时间的元素,即按照什么时间规则去执行任务。Quartz中主要提供了四种类型的trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和NthIncludedDayTrigger。这四种trigger可以满足企业应用中的绝大部分需求。

Job用于表示被调度的任务。主要有两种类型的job:无状态的(stateless)和有状态的(stateful)。对于同一个trigger来说,有状态的job不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。Job主要有两种属性:volatility和durability,其中volatility表示任务是否被持久化到数据库存储,而durability表示在没有trigger关联的时候任务是否被保留。两者都是在值为true的时候任务被持久化或保留。一个job可以被多个trigger关联,但是一个trigger只能关联一个job。

Scheduler由scheduler工厂创建:DirectSchedulerFactory或者StdSchedulerFactory。第二种工厂StdSchedulerFactory使用较多,因为DirectSchedulerFactory使用起来不够方便,需要作许多详细的手工编码设置。Scheduler主要有三种:RemoteMBeanScheduler,RemoteScheduler和StdScheduler。

Quartz核心元素之间的关系如图1.1所示:

b7a03654f96673d24f83b7361aa6567b.png

图1.1 核心元素关系图

1.2 Quartz 线程视图

  在Quartz中,有两类线程,Scheduler调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。

15dca0ffd83909d8e378fcf55f4b1c37.png

图1.2 Quartz线程视图

Scheduler调度线程主要有两个:执行常规调度的线程,和执行misfiredtrigger的线程。常规调度线程轮询存储的所有trigger,如果有需要触发的trigger,即到达了下一次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。Misfire线程是扫描所有的trigger,查看是否有misfiredtrigger,如果有的话根据misfire的策略分别处理(fire now OR wait for the next fire)。

1.3 Quartz Job数据存储

Quartz中的trigger和job需要存储下来才能被使用。Quartz中有两种存储方式:RAMJobStore,JobStoreSupport,其中RAMJobStore是将trigger和job存储在内存中,而JobStoreSupport是基于jdbc将trigger和job存储到数据库中。RAMJobStore的存取速度非常快,但是由于其在系统被停止后所有的数据都会丢失,所以在集群应用中,必须使用JobStoreSupport。

2、Quartz集群原理2.1 Quartz 集群架构

  一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点。这就意味着你必须对每个节点分别启动或停止。Quartz集群中,独立的Quartz节点并不与另一其的节点或是管理节点通信,而是通过相同的数据库表来感知到另一Quartz应用的,如图2.1所示。

99bb5fb953453960406ffa0298295522.png

图2.1 Quartz集群架构

2.2 Quartz集群相关数据库表

  因为Quartz集群依赖于数据库,所以必须首先创建Quartz数据库表,Quartz发布包中包括了所有被支持的数据库平台的SQL脚本。这些SQL脚本存放于<quartz_home>/docs/dbTables 目录下。这里采用的Quartz 1.8.4版本,总共12张表,不同版本,表个数可能不同。数据库为mysql,用tables_mysql.sql创建数据库表。全部表如图2.2所示,对这些表的简要介绍如图2.3所示。

a3bc9c2a14f53092cb330ea56725737b.png

图2.2 Quartz 1.8.4在mysql数据库中生成的表

36a62a026e3b1739e50325b25acb3e74.png

图2.3 Quartz数据表简介

2.2.1 调度器状态表(QRTZ_SCHEDULER_STATE)

  说明:集群中节点实例信息,Quartz定时读取该表的信息判断集群中每个实例的当前状态。

instance_name:配置文件中org.quartz.scheduler.instanceId配置的名字,如果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字。

last_checkin_time:上次检入时间

checkin_interval:检入间隔时间

2.2.2 触发器与任务关联表(qrtz_fired_triggers)

  存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息。

2.2.3 触发器信息表(qrtz_triggers)

trigger_name:trigger的名字,该名字用户自己可以随意定制,无强行要求

trigger_group:trigger所属组的名字,该名字用户自己随意定制,无强行要求

job_name:qrtz_job_details表job_name的外键

job_group:qrtz_job_details表job_group的外键

trigger_state:当前trigger状态设置为ACQUIRED,如果设为WAITING,则job不会触发

trigger_cron:触发器类型,使用cron表达式

2.2.4 任务详细信息表(qrtz_job_details)

  说明:保存job详细信息,该表需要用户根据实际情况初始化

job_name:集群中job的名字,该

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值