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

一、核心概念

quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。

1、job

表示一个工作,要执行的具体内容。此接口中只有一个方法

void execute(jobexecutioncontext context)

2、jobdetail

jobdetail表示一个具体的可执行的调度程序,job是这个可执行程调度程序所要执行的内容,另外jobdetail还包含了这个任务调度的方案和策略。

3、trigger代表一个调度参数的配置,什么时候去调。

4、scheduler代表一个调度容器,一个调度容器中可以注册多个jobdetail和trigger。当trigger与jobdetail组合,就可以被scheduler容器调度了。

二、一个最简单入门实例

import org.quartz.*;

import org.quartz.impl.stdschedulerfactory;

import java.util.date;

/**

* quartz定时器测试

*

* @author leizhimin 2009-7-23 8:49:01

*/

public class myjob implements job {

public void execute(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception {

system.out.println(new date() + ": doing something...");

}

}

class test {

public static void main(string[] args) {

//1、创建jobdetial对象

jobdetail jobdetail = new jobdetail();

//设置工作项

jobdetail.setjobclass(myjob.class);

jobdetail.setname("myjob_1");

jobdetail.setgroup("jobgroup_1");

//2、创建trigger对象

simpletrigger strigger = new simpletrigger();

strigger.setname("trigger_1");

strigger.setgroup("trigger_group_1");

strigger.setstarttime(new date());

//设置重复停止时间,并销毁该trigger对象

java.util.calendar c = java.util.calendar.getinstance();

c.settimeinmillis(system.currenttimemillis() + 1000 * 1l);

strigger.setendtime(c.gettime());

strigger.setfireinstanceid("trigger_1_id_001");

//设置重复间隔时间

strigger.setrepeatinterval(1000 * 1l);

//设置重复执行次数

strigger.setrepeatcount(3);

//3、创建scheduler对象,并配置jobdetail和trigger对象

schedulerfactory sf = new stdschedulerfactory();

scheduler scheduler = null;

try {

scheduler = sf.getscheduler();

scheduler.schedulejob(jobdetail, strigger);

//4、并执行启动、关闭等操作

scheduler.start();

} catch (schedulerexception e) {

e.printstacktrace();

}

//                try {

//                        //关闭调度器

//                        scheduler.shutdown(true);

//                } catch (schedulerexception e) {

//                        e.printstacktrace();

//                }

}

}

执行结果:

当把结束时间改为:

//设置重复停止时间,并销毁该trigger对象

java.util.calendar c = java.util.calendar.getinstance();

c.settimeinmillis(system.currenttimemillis() + 1000 * 1l);

strigger.setendtime(c.gettime());

执行结果:

当添加一条关闭调度器的语句:

//4、并执行启动、关闭等操作

scheduler.start();

scheduler.shutdown(true);

程序执行结果:

thu jul 23 10:11:50 cst 2009: doing something...

process finished with exit code 0

仅仅执行了一次,这一次能执行完,原因是设定了scheduler.shutdown(true);true表示等待本次任务执行完成后停止。

从这里也可以看出,scheduler是个容器,scheduler控制jobdetail的执行,控制的策略是通过trigger。

当scheduler容器启动后,jobdetail才能根据关联的trigger策略去执行。当scheduler容器关闭后,所有的jobdetail都停止执行。

三、透过实例看原理

通过研读quartz的源代码,和本实例,终于悟出了quartz的工作原理。

1、scheduler是一个计划调度器容器(总部),容器里面可以盛放众多的jobdetail和trigger,当容器启动后,里面的每个jobdetail都会根据trigger按部就班自动去执行。

2、jobdetail是一个可执行的工作,它本身可能是有状态的。

3、trigger代表一个调度参数的配置,什么时候去调。

4、当jobdetail和trigger在scheduler容器上注册后,形成了装配好的作业(jobdetail和trigger所组成的一对儿),就可以伴随容器启动而调度执行了。

5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。

6、将上述的结构用一个图来表示,如下:

四、总结

1、搞清楚了上quartz容器执行作业的的原理和过程,以及作业形成的方式,作业注册到容器的方法。就认识明白了quartz的核心原理。

2、quartz虽然很庞大,但是一切都围绕这个核心转,为了配置强大时间调度策略,可以研究专门的crontrigger。要想灵活配置作业和容器属性,可以通过quartz的properties文件或者xml来实现。

3、要想调度更多的持久化、结构化作业,可以通过数据库读取作业,然后放到容器中执行。

4、所有的一切都围绕这个核心原理转,搞明白这个了,再去研究更高级用法就容易多了。

5、quartz与spring的整合也非常简单,spring提供一组bean来支持:methodinvokingjobdetailfactorybean、simpletriggerbean、schedulerfactorybean,看看里面需要注入什么属性即可明白了。spring会在spring容器启动时候,启动quartz容器。

6、quartz容器的关闭方式也很简单,如果是spring整合,则有两种方法,一种是关闭spring容器,一种是获取到schedulerfactorybean实例,然后调用一个shutdown就搞定了。如果是quartz独立使用,则直接调用scheduler.shutdown(true);

7、quartz的jobdetail、trigger都可以在运行时重新设置,并且在下次调用时候起作用。这就为动态作业的实现提供了依据。你可以将调度时间策略存放到数据库,然后通过数据库数据来设定trigger,这样就能产生动态的调度。

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值