quartz工作原理

角色

  • 1、scheduler是一个计划调度器容器(总部),容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。
  • 2、JobDetail是一个可执行的工作,它本身可能是有状态的。
  • 3、Trigger代表一个调度参数的配置,什么时候去调。
  • 4、当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一对儿),就可以伴随容器启动而调度执行了。
  • 5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。

将上述的结构用一个图来表示,如下:
在这里插入图片描述

表结构

Quartz的集群部署方案在架构上是分布式的,没有负责集中管理的节点,而是利用数据库锁的方式来实现集群环境下进行并发控制

在这里插入图片描述

--QRTZ_LOCKS表结构
CREATE TABLE `QRTZ_LOCKS` (
  `LOCK_NAME` varchar(40) NOT NULL,
   PRIMARY KEY (`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--QRTZ_LOCKS记录
+-----------------+ 
| LOCK_NAME       |
+-----------------+ 
| CALENDAR_ACCESS |
| JOB_ACCESS      |
| MISFIRE_ACCESS  |
| STATE_ACCESS    |
| TRIGGER_ACCESS  |
+-----------------+

可以看出QRTZ_LOCKS中有5条记录,代表5把锁,分别用于实现多个Quartz Node对Job、Trigger、Calendar访问的同步控制

在select语句之后加for update来实现。例如,**TRIGGERACCESS表示对任务触发器相关的信息进行修改、删除操作时所需要获得的锁。**这时,执行查询这个表数据的SQL形如:

select * from QRTZ_LOCKS t where t.lock_name='TRIGGER_ACCESS' for update

当一个线程使用上述的SQL对表中的数据执行查询操作时,若查询结果中包含相关的行,数据库就对该行进行ROW LOCK;若此时,另外一个线程使用相同的SQL对表的数据进行查询,由于查询出的数据行已经被数据库锁住了,此时这个线程就只能等待,直到拥有该行锁的线程完成了相关的业务操作,执行了commit动作后,数据库才会释放了相关行的锁,这个线程才能继续执行。

通过这样的机制,在集群环境下,结合悲观锁的机制就可以防止一个线程对数据库数据的操作的结果被另外一个线程所覆盖,从而可以避免一些难以觉察的错误发生。当然,达到这种效果的前提是需要把Connection设置为手动提交,即autoCommit为false

通过这个机制,一次只能有一个线程来操作 加锁 - 操作 - 释放锁。 如果 操作 的时间过长的话,会带来集群间的主线程等待
数据库行锁是一种悲观锁,锁表时其它线程无法查询。

参考:http://www.360doc.com/content/18/1117/15/60781591_795496422.shtml

### Quartz框架的工作原理及工作流程解析 Quartz 是一个功能强大的开源作业调度框架,能够帮助开发者实现定时任务的创建、修改、删除、执行以及监控等操作。其核心原理基于任务调度机制,通过定义任务(Job)和触发规则(Trigger),实现任务的自动化执行。 #### 1. 核心概念 Quartz 框架中包含几个关键概念: - **Job**:表示具体的任务逻辑,是一个接口,开发者需要实现其 `execute` 方法来定义任务的具体操作。 - **JobDetail**:描述任务的详细信息,包括任务类、任务标识等。 - **Trigger**:定义任务的触发规则,可以是简单的定时触发(SimpleTrigger)或基于 Cron 表达式的复杂触发(CronTrigger)。 - **Scheduler**:调度器负责管理任务的生命周期,包括任务的注册、启动、暂停和终止等。 #### 2. 工作流程 Quartz 的工作流程可以分为以下几个步骤: 1. **定义任务**:通过实现 `Job` 接口,定义任务的具体执行逻辑。 2. **创建 JobDetail**:使用 `JobBuilder` 创建 `JobDetail` 对象,指定任务类和任务标识。 3. **定义触发规则**:通过 `TriggerBuilder` 创建 `Trigger` 对象,设置任务的触发时间规则。 4. **注册任务与触发规则**:将 `JobDetail` 和 `Trigger` 绑定到调度器(Scheduler)中。 5. **启动调度器**:调用 `Scheduler.start()` 方法启动调度器,调度器会根据触发规则监控时间并执行任务。 6. **任务执行**:当触发条件满足时,调度器会调用任务的 `execute` 方法,执行任务逻辑。 #### 3. 示例代码 以下是一个简单的 Quartz 使用示例,展示了如何定义任务、创建触发规则并启动调度器: ```java public class TestMyJob { public static void main(String[] args) { // 创建 JobDetail 并指定任务类 JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("job1", "group1") .build(); // 创建 Trigger 并设置 Cron 表达式 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "trigger1") .withSchedule(CronScheduleBuilder.cronSchedule("0 39 22 * * ?")) .build(); // 创建调度器并注册任务与触发规则 try { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 4. 调度机制 Quartz 的调度机制基于触发器(Trigger)与调度器(Scheduler)的协同工作。当调度器启动后,它会持续监控触发器的条件是否满足。一旦触发条件与当前时间匹配,调度器会调用任务的 `execute` 方法,执行任务逻辑[^4]。 #### 5. 灵活性与扩展性 Quartz 的灵活性体现在其支持多种触发规则,包括简单的定时触发和基于 Cron 表达式的复杂触发。此外,Quartz 还支持任务的持久化、监控以及图形化界面操作,能够满足复杂的定时任务需求[^2]。 #### 6. 整合 Spring Boot 在 Spring Boot 中,Quartz 可以与 Spring 框架无缝整合,通过配置文件和注解简化任务的定义与管理。Spring Boot 提供了对 Quartz 的自动配置支持,使得开发者可以更轻松地实现定时任务的调度与管理[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值