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

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的原理,定时任务框架是web开发过程中使用很多的框架之一

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

    Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便,下面我们看看如何使用它

    Quartz.NET-2.0

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

    Quartz使用总结

    Quartz的原理简介,可以实现任务的调度和定时的添加,在文中给了基础的使用方法的代码展示!!!!

    Quartz集群原理以及配置应用的方法详解

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

    quartz动态控制定时任务

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

    Quartz多线程示例.rar

    Quartz使用StdSchedulerFactory(调度器工厂)实现多线程原理,可以自定义线程个数来实现不同的需求,代码中有详细注释说明

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当Spring容器启动时,它会扫描所有带有@Scheduled注解的方法,并将它们注册到任务调度器中。任务调度器会根据注解中指定的时间间隔或Cron表达式来触发...

    P2P网络借贷平台项目SSH+Redis+ActiveMQ+POI+Shiro+AngularJS+Nginx+Quartz等

    10、后台权限采用流行的shiro权限管理框架,通过本项目可以深入了解shiro权限框架的应用及原理。 11、项目部署采用tomcat+Nginx的集群部署方式,在部署过程中可以深刻体会到nginx在负载均衡中发挥的优势。

    Spring攻略(第二版 中文高清版).part2

    1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 ...

    Spring攻略(第二版 中文高清版).part1

    1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 ...

    Python定时任务框架APScheduler原理及常用代码

    APScheduler简介 在平常的工作中几乎有一半...APScheduler基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务

    Java常见面试问题.docx

    9.Quartz的定时调度是怎么实现的?定时调度流程? Wait、notify 实现job类,设置触发器 放到调度器中 start 10.Springboot是怎么整合quartz的? 11.Rides的几种数据类型及应用场景? 12.工作流 activety? 13.禅道...

    Java调度原理及使用.docx

    任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。本文由浅入深介绍四种任务调度的 Java 实现: • Timer • ScheduledExecutor • 开源工具包 Quartz • 开源工具包 JCronTab

    Elastic-Job分布式任务调度视频教程

    有了任务调度即可解放更多的人力由系统自动去执行任务,Elastic-job是当当网基于quartz 二次开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片。2、课程价值本着从...

    毕设&课设&项目&实训-基于Asp.Net Core 5.0采用Quartz.Net编写的开源任务调度Web管理平台.zip

    对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同...

    spring学习

    学习了spring中aop原理,学习并实现简单的ioc注入,学习了一些关于quartz的用法(simpletrigger,crontrigger),简单的一些事务配置等

    电子时钟系统的设计与实现.doc

    As digital integrated circuit technology and uses advanced quartz technology to enable electronic clock has accurate time and stable performance, portable and easy, it also used for timing, ...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.2.2. 工作原理........................................................................................................................................................... 26 1.3. Seam 中的可点击列表:...

    java实现学生管理系统源码-kob:中心化的作业调度系统,定义了任务调度模型,实现了任务调度的统一管理和监控

    项目需要作业调度模块是个常见需求,在之前单体系统中,集成了Quartz完成作业调度模块,因为单体应用集成一次后,单从技术层面看几乎没有新的工作量,而且整体还是比较稳定的,但是当单体应用进行微服务拆分后,很多...

Global site tag (gtag.js) - Google Analytics