quartz源码解析(一)  、

http://ssuupv.blog.163.com/blog//146156722013829111028966/

任何个人、任何企业、任何行业都会有作业调度的需求。举几个简单的例子:

1、每个月都会发工资,每个月都要报销等;

2、每个人每天都要吃饭和睡觉;

3、每个公司都有会计帐期,都需要向公司领导汇报月报、季报、年报等。

4、银行和金融行业每天都需要日切等等。

对于个人,对作业调度的感知不是非常明确,但对于一个企业,一个好的作业调度可以为企业节省很多时间和金钱。俗话说,时间就是金钱,过高的资源投入到枯燥的任务中无疑是金钱和资源的浪费,随着业务流程复杂性的提高,自动化流程和自动化作业调度更能凸显出益处来。之所以自动化的出现,因为在做重复性工作时,人的效率和正确率远低于电脑。把一系列任务自动安排到一个作业中,然后再为这个作业创建一个调度器,到时候这个作业就会自动执行了。

Quartz是经典的作业调度框架,在深入研究之初,先仿照quartz的原理,设计一个简单的作业调度器,类图如下:

1、  先看job类,这个类,非常简单,只有一个execute方法,该方法是job具体执行的内容:

2、  jobdetail类,该类是对具体job类的封装,包括jobName(id),job执行需要的运行时参数,在名为jobdata的hashMap中

3、  trigger类,记录下次运行作业的时间和运行job的key:

4、  scheduler类,最重要的类,用来启动和停止框架

5、  scheduler的执行是在scheduler的schedulerThread中执行;线程中最重要的是run方法体,另外还有一个halt方法用来停止线程。先看halt方法

Run方法体为:

至此所有的框架代码都已经完成。注:没有考虑NullPointException和多线程问题。

再看下测试代码:

结果

系统按照下次运行时间来执行,并成功显示结果。

本章只是在抽取quartz的核心处理逻辑的基础智商,去除安全验证和多线程同步问题编写的基本调度任务。仅为抛砖引玉,为quartz源码的解析打个基础。

quartz框架分析(二)

http://ssuupv.blog.163.com/blog/static/146156722013829324461/

Quartz框架执行的任务需要写在一个实现Job接口的类中,在实现类中的execute(JobExecutionContext context)中执行相关的操作,通过实现Job接口来使你的Java 组件可以很简单的被scheduler执行,下面是job接口:

如上,你会看到job触发器出发时,job的execute方法会被执行。那么,scheduler的job是通过何种方式创建和执行的呢。先来看看job的部署,job是通过jobdetail scheduler到框架中去的,然后通过getJobClass()方法获取到job实现类的class字节码的,通过jobFactory的newJob()方法反射出Java 的具体实例,然后在JobRunShell线程对象的run方法中执行。

1、  先看看jobdetail的创建,在quartz2.0中,jobdetail是通过jobbuilder创建

Jobbuilder通过静态方法newjob()不同重载来创建Jobbuilder,通过withIdentity()重载设置参数,如下:

2、  创建号jobdetail后,scheduler通过线程类JobRunShell来执行Job。

通过initialize方法中调用JobFactory的newJob()创建Job实例。

JobFactory的newJob()方法通过反射使用默认无参数的构造方法实现job实例创建,如下:

Job的执行很简单,直接调用execute方法即可,以下代码省略中间检查部分:

Job的实现和执行很简单, 主要是业务逻辑,以下简单的把类之间的关系整理下:

quartz源码简析(三)

http://ssuupv.blog.163.com/blog/static/14615672201382931053129/

Quartz Trigger 部分

Trigger用来记录job任务的运行时间,运行次数等信息。Trigger的基本类图如下:

1、trigger接口主要提供trigger必备的一些参数信息,如triggerkey等,在trigger接口中只提供了jobkey,key等信息的get方法,并没有set方法,于是trigger接口派生一个MutableTrigger接口用于提供set上述字段值的方法。Trigger的其他子接口crontrigger和simpletrigger在提供了基本的trigger方法的基础上针对不同类型的trigger加以不同形式的参数方法。

2、所有trigger的实现类都是继承自AbstractTrigger,AbstractTrigger并没有提供任何特别的方法体,只是针对trigger接口的get方法和MutableTrigger接口的set方法对应的参数声明为private变量。

3、quartz中存在3个可实例化trigger。CronTriggerImpl、SimpleTriggerImpl和CalendarItervalTrigger。主要是针对time时间的计算。

总体来说trigger还是比较简单的

quartz源码解析--转的更多相关文章

  1. quartz源码解析(一)

    本文的起因源于一次quartz的异常,在win2003正常运行的程序放在linux环境就抛出异常了,虽然找出异常没花我多长时间,不过由此加深了对quzrtz的了解:古人说,三折肱,为良医,说明经验对于 ...

  2. springboot源码解析-管中窥豹系列之自动装配(九)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  3. [源码解析] 并行分布式任务队列 Celery 之 负载均衡

    [源码解析] 并行分布式任务队列 Celery 之 负载均衡 目录 [源码解析] 并行分布式任务队列 Celery 之 负载均衡 0x00 摘要 0x01 负载均衡 1.1 哪几个 queue 1.1 ...

  4. [源码解析] 并行分布式框架 Celery 之 容错机制

    [源码解析] 并行分布式框架 Celery 之 容错机制 目录 [源码解析] 并行分布式框架 Celery 之 容错机制 0x00 摘要 0x01 概述 1.1 错误种类 1.2 失败维度 1.3 应 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  9. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

随机推荐

  1. Linux学习笔记总结--CentOS 设置静态IP

    1.修改网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth ...

  2. 在WinForm中使用委托来在其他线程中改变控件的显示

    假设winform中有两个控件: 1.ListView用来显示进度的文本提示,ID:listView_progressInfo 2.ProgressBar用来显示进度,ID:progressBar1 ...

  3. java 流程执行 循环 foreach循环

    一. if分支 1. 结构  if  else if   else 2.执行原则 if  if  if 结构  会一直去执行()里的判断语句 if else if  else if 结构  只要一条( ...

  4. WTL的核心机制

    WTL背景介绍 WTL是微软ATL开发组成员Nenad Stefanovic先生在ATL Windowing机制上发展起来的一整套GUI框架,运用template技术组织和创建GUI对象,构筑了精致的 ...

  5. Java-struts2 配置hellow world

    这里进行struts框架的配置问题,和简单的输出hellow world 配置的步骤 1.      配置TomCat 2.      Jak 3.      拷贝struts.xml文件到src目录 ...

  6. 在C#中使用正则表达式自动匹配并获取所需要的数据

    转自:http://my.oschina.net/bv10000/blog/111736 正则表达式能根据设置匹配各种数据(比如:e-mail地址,电话号码,身份中号码等等).正则表达式功能强大,使用 ...

  7. UDP—Socket,套接字聊天简单的聊天程序。

    思路:(发送端) 1.既然需要聊天.就应该怎么建立聊天程序,,DatagramSocket对象http://www.w3cschool.cc/manual/jdk1.6/ DatagramSocket ...

  8. KMP算法_读书笔记

    下面是KMP算法的实现伪代码: KMP_MATCHER ( T, P ) . n = T.length . m = P.length . next = COMPUTE_PREFIX_FUNCTION ...

  9. oracle编译 失效对象方式

    如果procedure 所使用的表结构发生了改变等其它情况,在相应的xxx_objects表的status字段会变为invalid状态,但是如果在调用时procedure会自动编译,grant失效对象 ...

  10. 数据库(学习整理)----4--Oracle数据查询(基础点1)

    其他: 计算机中的内存是线性的,一维. length('')计算字符的个数,而不是字节的个数 Oracle中的日期类型和数值类型的数据可以做运算符(>,=,<,<>)比较 如果 ...