`
youyu4
  • 浏览: 440280 次
社区版块
存档分类
最新评论

Quartz实现原理

 
阅读更多

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

  • 大小: 17.6 KB
  • 大小: 31.1 KB
  • 大小: 20 KB
分享到:
评论

相关推荐

    深入解读Quartz的原理

    ### 深入解读Quartz的原理 #### 一、Quartz概述 Quartz 是一个功能强大且易于使用的 Java 开源定时任务调度器。它能够触发在指定的时间执行任务(通常称为作业)。Quartz 能够满足从简单的到非常复杂的业务场景...

    实现quartz定时器及quartz定时器原理介绍

    以下是一个使用Quartz实现的简单定时任务示例: ```java // 定义Job public class MyJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { ...

    quartz动态控制定时任务

    Quartz的工作原理是通过Job和Trigger两个核心概念来实现的,Job是具体需要执行的任务,Trigger用来触发任务的执行时机。在Quartz中,可以通过定义各种Trigger来实现不同的调度策略,如简单调度、Cron调度等。Quartz...

    Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了

    首先,理解Quartz的工作原理是关键。Quartz通过Scheduler接口来管理Job(任务)和Trigger(触发器)。Job是实际执行的任务,而Trigger定义了何时触发Job。当一个Job被触发时,Scheduler会创建一个JobDetail实例并将...

    Quartz 线程池

    本文将深入探讨 Quartz 线程池的工作原理、配置以及如何在实际项目中应用。 ### 一、Quartz 线程池的基本概念 线程池是计算机科学中的一个概念,主要用于管理多个并发运行的线程。在 Quartz 中,线程池负责处理由 ...

    对Quartz的简单封装

    Quartz是一款广泛使用的开源任务调度框架,用于在Java应用程序中实现定时任务的执行。...如果你正在寻找一种方式来管理和调度Java应用程序中的定时任务,那么学习这个封装的Quartz实现可能会对你有所帮助。

    Quartz.NET-2.0

    这就是Quartz.NET怎样能并发运行多个作业的原理。Quartz.NET依赖一套松耦合的线程池管理部件来管理线程环境。作业是一个执行任务的简单.NET类。只需实现Quartz.IJob接口,IJob接口包含唯一的一个方法Execute(),作业...

    quartz 项目学习源码

    在这个"quartz 项目学习源码"中,你可以深入理解 Quartz 的工作原理和实现方式。 1. **Quartz 基本概念**: - **Job**:Quartz 中的 Job 是执行任务的基本单元,代表一个待执行的工作。 - **Trigger**:触发器...

    Quartz.NET 官方源码及演示例子

    7. **src**:源代码目录,包含Quartz.NET的源码,开发者可以查看和学习其内部工作原理。 8. **lib**:库文件夹,可能包含Quartz.NET依赖的外部库。 9. **doc**:文档目录,可能有API参考、用户指南等帮助材料。 *...

    quartz动态任务管理

    学习和理解这个源码包,可以帮助你深入理解Quartz的工作原理,以及如何在实际项目中灵活运用。通过分析和实践,你可以掌握如何创建动态任务,如何根据业务需求调整任务执行策略,以及如何进行错误处理和监控。这将对...

    C#Quartz定时任务

    【C# Quartz定时任务】是基于C#编程语言实现的一...通过上述知识,你不仅可以理解C# Quartz定时任务的基本原理,还能构建自己的任务调度系统。在实际项目中,可以根据需求灵活配置和扩展,实现各种复杂的定时任务需求。

    Quartz-1.8.4官方

    在1.8.4这个版本中,用户可以获取到官方的原始代码、编译后的jar包以及官方提供的示例,这为开发者提供了深入理解Quartz工作原理和实践应用的宝贵资源。 Quartz的核心特性包括: 1. **灵活的任务调度**:Quartz...

    Quartz

    #### 三、Quartz的工作原理 Quartz的核心概念包括Job和Trigger。Job代表需要执行的任务本身,而Trigger则是控制Job何时执行的机制。 1. **Job的定义**: - 实现`org.quartz.Job`接口是创建一个Job的基础。该接口...

    Quartz深入浅出

    通过阅读《Quartz学习.doc》和《Quartz学习.ppt》,你可以更深入地了解Quartz的原理、配置、使用示例和最佳实践,进一步提升你在Web开发中的任务调度能力。文档中可能还会涵盖如何处理Job执行异常、如何设置Job依赖...

    Spring+Quartz实现定时任务的配置方法.rar

    首先,理解Spring与Quartz的集成原理。Spring通过其`org.springframework.scheduling.quartz`包提供了对Quartz的全面支持,允许我们在Spring应用上下文中配置和管理Quartz的Job和Trigger。这样,我们可以利用Spring...

    spring2与quartz在Web整合

    2. **Quartz 工作原理**:Quartz 是基于 JDBC 或内存的数据存储方式来管理作业和触发器的。它通过 Scheduler 接口来调度作业,作业是需要执行的任务,触发器则定义了作业的执行时间或频率。Quartz 还支持 Cron ...

    quartz调度系统工具.zip

    Quartz是一款开源的作业...通过这些工具,开发者可以更轻松地利用Quartz实现定时任务,提高系统的自动化程度。同时,理解Quartz的工作原理和API,可以帮助你更好地优化任务调度,避免资源浪费,提升系统的响应效率。

    quartz单机和WEB应用

    Quartz是一款开源的作业调度框架,它允许开发者创建、组织和执行定时任务。在Web应用程序中集成...例如,了解如何创建自定义Job、Trigger类型,如何处理并发任务,以及如何在分布式环境中使用Quartz实现集群调度等。

    quartz-2.1.6.zip

    通过阅读这份文档,开发者能够迅速理解Quartz的工作原理,并开始自己的项目。 quartz-all-2.1.6.jar 包含了Quartz的所有功能,包括核心库和所有依赖的模块,这使得开发者在一个单一的JAR文件中就可以使用Quartz的...

Global site tag (gtag.js) - Google Analytics