http://ssuupv.blog.163.com/blog//146156722013829111028966/安全
任何我的、任何企业、任何行业都会有做业调度的需求。举几个简单的例子:多线程
一、每月都会发工资,每月都要报销等;框架
二、每一个人天天都要吃饭和睡觉;测试
三、每一个公司都有会计账期,都须要向公司领导汇报月报、季报、年报等。ui
四、银行和金融行业天天都须要日切等等。spa
对于我的,对做业调度的感知不是很是明确,但对于一个企业,一个好的做业调度能够为企业节省不少时间和金钱。俗话说,时间就是金钱,太高的资源投入到枯燥的任务中无疑是金钱和资源的浪费,随着业务流程复杂性的提升,自动化流程和自动化做业调度更能凸显出益处来。之因此自动化的出现,由于在作重复性工做时,人的效率和正确率远低于电脑。把一系列任务自动安排到一个做业中,而后再为这个做业建立一个调度器,到时候这个做业就会自动执行了。线程
Quartz是经典的做业调度框架,在深刻研究之初,先仿照quartz的原理,设计一个简单的做业调度器,类图以下:设计
一、 先看job类,这个类,很是简单,只有一个execute方法,该方法是job具体执行的内容:对象
二、 jobdetail类,该类是对具体job类的封装,包括jobName(id),job执行须要的运行时参数,在名为jobdata的hashMap中blog
三、 trigger类,记录下次运行做业的时间和运行job的key:
四、 scheduler类,最重要的类,用来启动和中止框架
五、 scheduler的执行是在scheduler的schedulerThread中执行;线程中最重要的是run方法体,另外还有一个halt方法用来中止线程。先看halt方法
Run方法体为:
至此全部的框架代码都已经完成。注:没有考虑NullPointException和多线程问题。
再看下测试代码:
结果
系统按照下次运行时间来执行,并成功显示结果。
本章只是在抽取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方法中执行。
一、 先看看jobdetail的建立,在quartz2.0中,jobdetail是经过jobbuilder建立
Jobbuilder经过静态方法newjob()不一样重载来建立Jobbuilder,经过withIdentity()重载设置参数,以下:
二、 建立号jobdetail后,scheduler经过线程类JobRunShell来执行Job。
经过initialize方法中调用JobFactory的newJob()建立Job实例。
JobFactory的newJob()方法经过反射使用默认无参数的构造方法实现job实例建立,以下:
Job的执行很简单,直接调用execute方法便可,如下代码省略中间检查部分:
Job的实现和执行很简单, 主要是业务逻辑,如下简单的把类之间的关系整理下:
http://ssuupv.blog.163.com/blog/static/14615672201382931053129/
Quartz Trigger 部分
Trigger用来记录job任务的运行时间,运行次数等信息。Trigger的基本类图以下:
一、trigger接口主要提供trigger必备的一些参数信息,如triggerkey等,在trigger接口中只提供了jobkey,key等信息的get方法,并无set方法,因而trigger接口派生一个MutableTrigger接口用于提供set上述字段值的方法。Trigger的其余子接口crontrigger和simpletrigger在提供了基本的trigger方法的基础上针对不一样类型的trigger加以不一样形式的参数方法。
二、全部trigger的实现类都是继承自AbstractTrigger,AbstractTrigger并无提供任何特别的方法体,只是针对trigger接口的get方法和MutableTrigger接口的set方法对应的参数声明为private变量。
三、quartz中存在3个可实例化trigger。CronTriggerImpl、SimpleTriggerImpl和CalendarItervalTrigger。主要是针对time时间的计算。
整体来讲trigger仍是比较简单的