【Quartz】基本原理
1 核心概念
1.1 核心元素
(1)Scheduler
任务调度器,是Quartz框架的核心,负责管理其他组件。
(2)Trigger
触发器,用于定义任务调度的时间规则,有SimpleTrigger、CronTrigger、DateIntervalTrigger和NthIncludedDayTrigger。
trigger还有一个重要的属性misfire;如果scheduler关闭了,或者Quartz线程池中没有可用的线程来执行job,此时持久性的trigger就会错过(miss)其触发时间,即错过触发(misfire)。不同类型的trigger,有不同的misfire机制。它们默认都使用“智能机制(smart policy)”,即根据trigger的类型和配置动态调整行为。当scheduler启动的时候,查询所有错过触发(misfire)的持久性trigger,然后根据它们各自的misfire机制更新trigger的信息。
(3)Job
任务,即要被执行的任务。作业是一个执行任务的简单Java类,只需你实现org.quartz.Job接口并且在出现严重错误情况下抛出JobExecutionException异常即可。一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job。
Job接口包含唯一的一个方法execute(),作业从这里开始执行。一旦实现了Job接口和execute()方法,当Quartz确定该是作业运行的时候,它将调用你的作业。Execute()方法内就完全是你要做的事情。
主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。有状态作业在每次执行时只有一个实例,每次执行时会查看JobDataMap的状态改变。Job 主要有两种属性:volatility 和 durability,其中 volatility 表示任务是否被持久化到数据库存储,而 durability 表示在没有 trigger 关联的时候任务是否被保留。两者都是在值为 true 的时候任务被持久化或保留。
2 数据存储
作业一旦被调度,调度器需要记住并且跟踪作业和它们的执行次数。Quartz通过一个称之为作业存储(JobStore)的概念来做作业存储和管理。 Quartz 中有两种存储方式:
(1)RAMJobStore
使用内存来持久化调度程序信息。优点是容易配置、构造和运行。缺点是当应用程序停止运行时,所有调度信息将被丢失。
(2)JobStoreSupport
通过JDBC存储数据到数据库中。quartz集群是通过数据库表来感知其他的应用的,各个节点之间并没有直接的通信。只有使用持久的JobStore才能完成Quartz集群。有两种类型:
· JobStoreTX:自己控制事务时使用
· JobStoreCMT:容器控制事务时使用
数据库表有:
|
Table name |
Description |
|
QRTZ_CALENDARS |
存储Quartz的Calendar信息 |
|
QRTZ_CRON_TRIGGERS |
存储CronTrigger,包括Cron表达式和时区信息 |
|
QRTZ_FIRED_TRIGGERS |
存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息 |
|
QRTZ_PAUSED_TRIGGER_GRPS |
存储已暂停的Trigger组的信息 |
|
QRTZ_SCHEDULER_STATE |
存储少量的有关Scheduler的状态信息,和别的Scheduler实例 |
|
QRTZ_LOCKS |
存储程序的悲观锁的信息 |
|
QRTZ_JOB_DETAILS |
存储每一个已配置的Job的详细信息 |
|
QRTZ_SIMPLE_TRIGGERS |
存储简单的Trigger,包括重复次数、间隔、以及已触的次数 |
|
QRTZ_BLOG_TRIGGERS |
Trigger作为Blob类型存储 |
|
QRTZ_TRIGGERS |
存储已配置的Trigger的信息 |
|
QRTZ_SIMPROP_TRIGGERS |
本文也参考了https://blog.csdn.net/lkl_csdn/article/details/73613033和https://blog.csdn.net/guolong1983811/article/details/51501346,谢谢两位作者。
【Quartz】基本原理的更多相关文章
- Quartz原理解密
Quartz原理解密 Author: Dorae Date:2018年7月17日15:55:02 转载请注明出处 一.quartz概述 quartz是一个用java实现的开源任务调度框架,可以用来创建 ...
- quartz (从原理到应用)详解篇(转)
一.Quartz 基本介绍 1.1 Quartz 概述 1.2 Quartz特点 1.3 Quartz 集群配置 二.Quartz 原理及流程 2.1 quartz基本原理 2.2 quartz启动流 ...
- 定时组件quartz系列<二>quartz的集群原理
1.基本信息: Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或 ...
- 浅析Quartz的集群配置
浅析Quartz的集群配置(一) 收藏人:Rozdy 2015-01-13 | 阅:1 转:22 | 来源 | 分享 1 基本信息 摘要:Quar ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(84)-Quartz 作业调度用法详解一
前言 我从Quartz2.0开始使用,并对其进行了封装了界面,可以参考 http://www.cnblogs.com/ymnets/p/5065154.html 最近拿出来进行了优化,并升级到最新版, ...
- 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...
- Quartz
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度. eg: ja ...
- Ognl表达式基本原理和使用方法
Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...
- Spring Quartz实现任务调度
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
随机推荐
- jQuery的过滤器总结
1.内容过滤器 $(function () { // $("a:contains('标签')").css("color","green") ...
- jquery记录
jquery validate验证框架 参考:http://www.cnblogs.com/linjiqin/p/3431835.html http://www.runoob.com/jquery/j ...
- 安装scrapy解决的坑
在windows下: pip install scrapy 最后一步报错: 本来以为是缺少 Microsoft Visual C++ 14.0 这个库,一看下载需要400多M,算了再看下报错... 感 ...
- openpose
编译libpthread.so pthread2 ihash
- Zookeeper 源码(七)请求处理
Zookeeper 源码(七)请求处理 以单机启动为例讲解 Zookeeper 是如何处理请求的.先回顾一下单机时的请求处理链. // 单机包含 3 个请求链:PrepRequestProcessor ...
- innobackupex工作原理
写篇文章凑个数,基本是翻译,建议看原文. http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/how_innobackupex ...
- 使用类加载器加载配置文件/getClassLoader().getResourceAsStream()
加载配置文件的两种方式; 1. 2. 两者相比,第一种方式更为方便,因为文件目录发生改变就会找不到.
- android 播放视频时切换全屏隐藏状态栏
1. Demo: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance ...
- 一文读懂 超简单的spark structured stream 源码解读
为了让大家理解structured stream的运行流程,我将根据一个代码例子,讲述structured stream的基本运行流程和原理. 下面是一段简单的代码: val spark = Spar ...
- SpringMVC源码解读 - HandlerMapping
SpringMVC在请求到handler处理器的分发这步是通过HandlerMapping模块解决的.handlerMapping 还处理拦截器. 先看看HandlerMapping的继承树吧 可以大 ...