Quartz集群原理分析-基于数据库行锁实现负载均衡

Quartz是一个强大的任务调度框架,支持多种调度方式和集群模式。在集群模式下,通过数据库行锁实现负载均衡,确保同一任务在集群中只由一台机器执行。配置涉及Spring设置、AutowiringSpringBeanJobFactory以及数据库表如QRTZ_LOCKS的行锁机制。集群模式下,调度线程不断查询并执行触发的任务,同时处理misfire job。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Quartz概念

Quartz是一个优秀的任务调度框架, 具有以下特点:
强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
负载均衡(基于数据库行锁实现)
高可用
调度器:scheduler

任务调度的控制器,负责定时任务的调度,并且提供任务和触发器的增删改查等api方法。
任务:job

job是实际被调度的任务,每个任务必须指定具体执行任务的实现类,实现类需要继承QuartzJobBean或者实现org.quartz.Job接口,具体的业务逻辑写在execute方法里面。
是否支持并发的注解:@DisallowConcurrentExecution
触发器:trigger

trigger用来定义调度时间的概念,即按什么样时间规则去触发任务。主要几种类型:
SimpleTrigger:简单触发器,从某个时间开始,每隔多少时间触发,重复多少次。
CronTrigger:使用cron表达式定义触发的时间规则,如"0 0 0,2,4 1/1 * ? *" 表示每天的0,2,4点触发。
DailyTimeIntervalTrigger:每天中的一个时间段,每N个时间单元触发,时间单元可以是毫秒,秒,分,小时
CalendarIntervalTrigger:每N个时间单元触发,时间单元可以是毫秒,秒,分,小时,日,月,年。
trigger状态:WAITING,ACQUIRED,EXECUTING,COMPLETE,BLOCKED,ERROR,PAUSED,PAUSED_BLOCKED,DELETED
未正常触发的任务:misfire job

没有在正常触发时间点触发的任务。主要由一下几种情况导致:
触发时间在应用不可用的时间内,比如重启
上次的执行时间过长,超过了下次触发的时间
任务被暂停一段时间后,重新被调度的时间在下次触发时间之后
处理misfire job的策略,需要在创建trigger的时候配置,每种trigger对应的枚举值都不同,具体在接口里面有定义。CronTrigger有2种处理misfire的策略:
处理策略
描述
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
立即触发一次
MISFIRE_INSTRUCTION_DO_NOTHING
忽略,不处理,等待下次触发
之间的关系:

scheduler由工厂类SchedulerFactory创建,主要负责job和trigger的持久化管理,包括新增、删除、修改、触发、暂停、恢复调度、停止调度等;
一个job可以关联多个trigger,但是一个trigger只能关联一个job。
二、集群模式

Quartz的集群模式指的是一个集群下多个节点管理同一批任务的调度,通过共享数据库的方式实现,保证同一个任务到达触发时间的时候,只有一台机器去执行该任务。每个节点部署一个单独的quartz实例,相互之间没有直接数据通信。

spring配置

<bean id="quartzJobFactory" class="com.taobao.trip.hcs.service.gubei.job.AutowiringSpringBeanJobFactory">
    <property name="ignoredUnknownProperties" value="applicationContext"/>
</bean>
 
<!-- Scheduler Factory -->
<bean id="quartzScheduler"
      class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobFactory" ref="quartzJobFactory"/>
    <!-- 数据源 -->
    <property name="dataSource" ref="dataSource" />
    <!-- 配置项-->
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">${quartz.scheduler.instanceName}}</prop>
            <prop key="org.quartz.scheduler.instanceId">hcs-crawl</prop>
            <!-- 执行任务的线程池配置 -->
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">20</prop>
            <prop key="org.quartz.threadPool.threadPriority">5</prop>
            <!-- JobStore config -->
            <!--单机模式:org.quartz.simpl.RAMJobStore -->
            <!--集群模式:org.quartz.impl.jdbcjobstore.JobStoreTX, org.quartz.impl.jdbcjobstore.JobStoreCMT -->
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStore

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值