Quartz实现原理
主要组成部分:
scheduler(调度器):将job和trigger绑定在一起
job(任务) :配置具体哪个类实现定时任务
trigger(触发器) :配置定时器参数,如:多久执行一次,执行多上次等
Quartz工作原理
分两类线程:
- Scheduler调度线程
- 任务执行线程
原理
执行常规调度的线程,常规调度线程轮询存储的所有trigger,如果有trigger到达了下一次触发的时间(用wait和notifyAll实现),则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。
Scheduler调度线程主要有两个:
- 执行常规调度的线程
- 执行misfiredtrigger的线程,Misfire线程是扫描所有的trigger,查看是否有misfiredtrigger,如果有的话根据misfire的策略分别处理(fire now OR wait for the next fire)。
Quartz Job数据存储
Quartz中的trigger和job需要存储下来才能被使用。
Quartz中有两种存储方式:
- RAMJobStore:将trigger和job存储在内存中,RAMJobStore的存取速度非常快,但是由于其在系统被停止后所有的数据都会丢失,所以在集群应用中,必须使用JobStoreSupport。
- JobStoreSupport:是基于jdbc将trigger和job存储到数据库中。适合集群应用。
Quartz集群原理
Quartz是在同一个数据库下,其实是使用数据库(如:MySQL)做分布式锁,当任务线程执行前加锁,执行完在finally解锁。
Quartz中执行了如下SQL,以悲观锁的形式,对某条数据进行行锁,这样其他执行线程就必须等待
public static final String SELECT_FOR_LOCK = "SELECT * FROM " + TABLE_PREFIX_SUBST + TABLE_LOCKS + " WHERE " + COL_SCHEDULER_NAME + " = " + SCHED_NAME_SUBST + " AND " + COL_LOCK_NAME + " = ? FOR UPDATE";
具体流程如下:
0.调度器线程run()
1.获取待触发trigger
1.1数据库LOCKS表TRIGGER_ACCESS行加锁
1.2读取JobDetail信息
1.3读取trigger表中触发器信息并标记为"已获取"
1.4commit事务,释放锁
2.触发trigger
2.1数据库LOCKS表STATE_ACCESS行加锁
2.2确认trigger的状态(已经被获取过的trigger,就不会再执行了)
2.3读取trigger的JobDetail信息
2.4读取trigger的Calendar信息
2.3更新trigger信息
2.3commit事务,释放锁
3实例化并执行Job
3.1从线程池获取线程执行JobRunShell的run方法
参考
http://www.jianshu.com/p/bab8e4e32952
https://www.cnblogs.com/zhenyuyaodidiao/p/4755649.html
http://blog.csdn.net/wenniuwuren/article/details/45866807
http://blog.csdn.net/tercel_opening_wing/article/details/49612497
相关推荐
### 深入解读Quartz的原理 #### 一、Quartz概述 Quartz 是一个功能强大且易于使用的 Java 开源定时任务调度器。它能够触发在指定的时间执行任务(通常称为作业)。Quartz 能够满足从简单的到非常复杂的业务场景...
以下是一个使用Quartz实现的简单定时任务示例: ```java // 定义Job public class MyJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { ...
Quartz的工作原理是通过Job和Trigger两个核心概念来实现的,Job是具体需要执行的任务,Trigger用来触发任务的执行时机。在Quartz中,可以通过定义各种Trigger来实现不同的调度策略,如简单调度、Cron调度等。Quartz...
首先,理解Quartz的工作原理是关键。Quartz通过Scheduler接口来管理Job(任务)和Trigger(触发器)。Job是实际执行的任务,而Trigger定义了何时触发Job。当一个Job被触发时,Scheduler会创建一个JobDetail实例并将...
本文将深入探讨 Quartz 线程池的工作原理、配置以及如何在实际项目中应用。 ### 一、Quartz 线程池的基本概念 线程池是计算机科学中的一个概念,主要用于管理多个并发运行的线程。在 Quartz 中,线程池负责处理由 ...
Quartz是一款广泛使用的开源任务调度框架,用于在Java应用程序中实现定时任务的执行。...如果你正在寻找一种方式来管理和调度Java应用程序中的定时任务,那么学习这个封装的Quartz实现可能会对你有所帮助。
这就是Quartz.NET怎样能并发运行多个作业的原理。Quartz.NET依赖一套松耦合的线程池管理部件来管理线程环境。作业是一个执行任务的简单.NET类。只需实现Quartz.IJob接口,IJob接口包含唯一的一个方法Execute(),作业...
在这个"quartz 项目学习源码"中,你可以深入理解 Quartz 的工作原理和实现方式。 1. **Quartz 基本概念**: - **Job**:Quartz 中的 Job 是执行任务的基本单元,代表一个待执行的工作。 - **Trigger**:触发器...
7. **src**:源代码目录,包含Quartz.NET的源码,开发者可以查看和学习其内部工作原理。 8. **lib**:库文件夹,可能包含Quartz.NET依赖的外部库。 9. **doc**:文档目录,可能有API参考、用户指南等帮助材料。 *...
学习和理解这个源码包,可以帮助你深入理解Quartz的工作原理,以及如何在实际项目中灵活运用。通过分析和实践,你可以掌握如何创建动态任务,如何根据业务需求调整任务执行策略,以及如何进行错误处理和监控。这将对...
【C# Quartz定时任务】是基于C#编程语言实现的一...通过上述知识,你不仅可以理解C# Quartz定时任务的基本原理,还能构建自己的任务调度系统。在实际项目中,可以根据需求灵活配置和扩展,实现各种复杂的定时任务需求。
在1.8.4这个版本中,用户可以获取到官方的原始代码、编译后的jar包以及官方提供的示例,这为开发者提供了深入理解Quartz工作原理和实践应用的宝贵资源。 Quartz的核心特性包括: 1. **灵活的任务调度**:Quartz...
#### 三、Quartz的工作原理 Quartz的核心概念包括Job和Trigger。Job代表需要执行的任务本身,而Trigger则是控制Job何时执行的机制。 1. **Job的定义**: - 实现`org.quartz.Job`接口是创建一个Job的基础。该接口...
通过阅读《Quartz学习.doc》和《Quartz学习.ppt》,你可以更深入地了解Quartz的原理、配置、使用示例和最佳实践,进一步提升你在Web开发中的任务调度能力。文档中可能还会涵盖如何处理Job执行异常、如何设置Job依赖...
首先,理解Spring与Quartz的集成原理。Spring通过其`org.springframework.scheduling.quartz`包提供了对Quartz的全面支持,允许我们在Spring应用上下文中配置和管理Quartz的Job和Trigger。这样,我们可以利用Spring...
2. **Quartz 工作原理**:Quartz 是基于 JDBC 或内存的数据存储方式来管理作业和触发器的。它通过 Scheduler 接口来调度作业,作业是需要执行的任务,触发器则定义了作业的执行时间或频率。Quartz 还支持 Cron ...
Quartz是一款开源的作业...通过这些工具,开发者可以更轻松地利用Quartz实现定时任务,提高系统的自动化程度。同时,理解Quartz的工作原理和API,可以帮助你更好地优化任务调度,避免资源浪费,提升系统的响应效率。
Quartz是一款开源的作业调度框架,它允许开发者创建、组织和执行定时任务。在Web应用程序中集成...例如,了解如何创建自定义Job、Trigger类型,如何处理并发任务,以及如何在分布式环境中使用Quartz实现集群调度等。
通过阅读这份文档,开发者能够迅速理解Quartz的工作原理,并开始自己的项目。 quartz-all-2.1.6.jar 包含了Quartz的所有功能,包括核心库和所有依赖的模块,这使得开发者在一个单一的JAR文件中就可以使用Quartz的...