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下搭建Oracle11g RAC(3)----创建用户及配置相关文件

    配置11gR2 RAC需要安装Oracle Grid Infrastructure软件.Oracle数据库软件,其中Grid软件等同于Oracle 10g的Clusterware集群件.Oracle建 ...

  2. Android(java)学习笔记171:Service生命周期

    1.Service的生命周期         Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Servic ...

  3. C#中的两种debug方法

    这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下   第一种:需要把调试方法改成debug代码用 #if DEBU ...

  4. zTree在Asp.Net中的使用

    前台代码: <link rel="stylesheet" href="../css/zTreeStyle/zTreeStyle.css" type=&qu ...

  5. 如何快速学习bootstrap

    bootstrap中文网http://www.bootcss.com/解决了我所有使用bootstrap的问题,从0开始,下面的全部链接都是该网站的子链接.例子http://v3.bootcss.co ...

  6. HTML+CSS 整站 步骤

    文件夹管理: CSS JS img font html 根据设计图,划分区块 ,即页面布局 重置样式 ;padding:0;} 写main.css  注意:1 距离尽量使用偶数,避免奇数 2 在使用定 ...

  7. 解决Visual Studio 找不到报表控件、rdlc中文乱码

    找回报表控件 运行安装程序中的 ..\packages\Reporting Services\RVAddon.msi 工具栏,右键选择ReportViewer,注意选择的版本 如果不能编辑报表文件(. ...

  8. android网络图片查看器

    package com.itheima.netimageviewer; import java.io.BufferedReader; import java.io.File; import java. ...

  9. java输入输出流(内容练习)

    1,编写一个程序,读取文件test.txt的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.i ...

  10. 删除svn密码方法

    很多时候使用svn,我们需要切换svn账号,但是由于之前的账号已经选择了记住密码,那么我们应该如何删除svn密码来切换新的svn账号呢? 其实很简单,svn账号密码信息保存在电脑某一文件中,我们只要删 ...