Quartz框架简介
一、Quartz概述:
Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间。其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。主要用来执行定时任务,如:定时发送信息、定时生成报表等等。
二、相关术语:
三、Quartz的体系结构简介:
Quartz框架主要核心组件包括调度器、触发器、作业。调度器作为作业的总指挥,触发器作为作业的操作者,作业为应用的功能模块。其关系如下图所示:
Job为作业的接口,为任务调度的对象;JobDetail用来描述Job的实现类及其它相关的静态信息;Trigger做为作业的定时管理工具,一个Trigger只能对应一个作业实例,而一个作业实例可对应多个触发器;Scheduler做为定时任务容器,是quartz最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个Scheduler都存有JobDetail和Trigger的注册,一个Scheduler中可以注册多个JobDetail和多个Trigger。
1、Job
Job是一个接口,只有一个方法void execute(JobExecutionContext context),被调度的作业(类)需实现该接口中execute()方法,JobExecutionContext类提供了调度上下文的各种信息。每次执行该Job均重新创建一个Job实例,如:
- public class DDNJob implements Job{
- public void execute(JobExecutionContext arg0) throws JobExecutionException {
- perform();
- }
- public void perform(){ //执行报表统计入口函数
- //业务逻辑
- System.out.println("自动DDN预授权开始执行-------------执行时间:"+new Date());
- }
- }
注:DDNJob类为需要定时执行的类,execute为定时执行的方法。一个定时任务对应一个Job实现类。
2、JobDetail
Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。JobDetail 用来保存我们作业的详细信息。一个JobDetail可以有多个Trigger,但是一个Trigger只能对应一个JobDetail,
示例:
- 1. JobDetail jobDetail = new JobDetail("myJob","myGroup",DDNJob.class)
- 2. 说明:
- 3. myJob:job 名
- 4. myGroup:job 组(为'null'时,使用缺省的组sched.DEFAULT_GROUP)
- 5. DDNJob.class:要被执行的Java类。
运用spring集成的MethodInvokingJobDetailFactoryBean时spring能自动生成符合quartz要去的JobDetail。
Spring中applicationContext.xml配置如下:
- <!-- detail任务描述 -->
- <bean name="DDNDetail"
- class="com.mangocity.mpm.common.autoDDN.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject" value="DDNJob" />
- <property name="concurrent" value="false"/>(并发执行)
- <property name="shouldRecover" value="true"/>
- </bean>
3、Trigger
Trigger是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和 CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则 可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;Spring中applicationContext.xml配置如下:
SimpleTrigger使用示例:
- // Initiate SimpleTrigger with its name and group name
- SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger","triggerGroup1");
- // set its start up time
- simpleTrigger.setStartTime(new Date(System.currentTimeMillis()));
- // set the interval, how often the job should run (10 seconds here)
- simpleTrigger.setRepeatInterval(10000);
- // set the number of execution of this job, set to 10 times.
- simpleTrigger.setRepeatCount(10);
通过Spring配置,jobDetail为配置的Job描述,startDelay为系统启动执行延迟时间,repeatCount为调用次数,repeatInterval为Job触发时间间隔。
- <bean id="DDNSimpletrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
- <property name="jobDetail" ref="DDNDetail"/>
- <property name="startDelay" value="1"/>
- <property name="repeatCount" value="100"/>
- <property name="repeatInterval" value="1000"/>
- </bean>
CronTrigger使用示例:
- // Initiate CronTrigger with its name and group name
- CronTrigger cronTrigger = new CronTrigger("cronTrigger","triggerGroup2");
- try {
- // setup CronExpression
- CronExpression cexp = new CronExpression("0/5 * * * * ?");
- // Assign the CronExpression to CronTrigger
- cronTrigger.setCronExpression(cexp);
- } catch (Exception e) {
- e.printStackTrace();
- }
通过Spring配置,jobDetail为配置的Job描述,cronExpression为Job的运行规则,具体见附录部分内容。
- <bean id="DDNCrontrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail" ref="DDNDetail"/>
- <property name="cronExpression" value="0/5 * * ? * * *"/>
- </bean>
4、Scheduler
Scheduler负责管理Quartz的运行环境,Quartz它是基于多线程架构的,它启动的时候会初始化一套线程,这套线程会用来执行一些预置的作业。Trigger和JobDetail可以注册到Scheduler中;Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。 Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。 应用示例:
- SchedulerFactory schedulerFactory = new StdSchedulerFactory();
- // Retrieve a scheduler from schedule factory
- Scheduler scheduler = schedulerFactory.getScheduler();
- …
- // schedule a job with JobDetail and Trigger
- scheduler.scheduleJob(jobDetail, simpleTrigger);
- // start the scheduler
- scheduler.start();
Spring中applicationContext.xml配置:
- <!-- 调度器 -->
- <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource"/>
- </property>
- <property name="triggers">
- <list>
- <!-- 触发器列表 -->
- <!-- <ref bean="DDNcronTrigger" /> -->
- <ref bean="DDNSimpletrigger" />
- </list>
- </property>
- <property name="configLocation" value="classpath:quartz.properties" />
- </bean>
其中,dataSource为数据源配置,triggers为触发器列表配置,可以同时包含多个trigger,configLocation为quartz配置文件quartz.properties加载路径。
四、总结:
我们不只有一种两种方法来实现我们的定时任务,就我知道的出了我们的quartz框架之外,我们spring也自己封装有自己的定时器,再加上各种开源的插件。那我工作的公司来说,我们用windows服务来完成这个定时任务,万变不离其宗,理解了他们的原理以及精髓,我们就可以去创新,去写出符合自己要求的工具了!
Quartz框架简介的更多相关文章
- spring整合Quartz框架过程,大家可以参考下
这篇文章详细介绍了spring集成quartz框架流程,通过示例代码进行了详细说明,对学习或任务有参考学习价值,并可供需要的朋友参考. 1.quartz框架简介(m.0831jl.com) quart ...
- [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介
第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...
- Quartz.NET简介及入门指南
Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAV ...
- Quartz 框架 教程(中文版)2.2.x
Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quar ...
- Quartz框架介绍
一.Quartz概述: Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高 ...
- Quartz框架(第一版)
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
- Quartz框架
Quartz框架 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多 ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- 《HiWind企业快速开发框架实战》(0)目录及框架简介
<HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...
随机推荐
- ccf559c
题意:给出一个矩阵棋盘,大小不超过10^5.上面有n个非法点(n<=2000)不可以踩,从左上角开始走到右下角,每次只能向下或者向右移动.问有多少种走法.结果对10^9+7取模. 分析: 组合数 ...
- 树形dp汇总
HDU 1520 HDU 2196 Codeforces 219D POJ 1155
- 《高性能MySql》阅读笔记
1.查询优化,索引优化和架构优化三者相辅相成.(数据库架构是获得高性能的必要条件,但如果查询设计得不好,即便是最好的架构页无法获得高性能.) 2.查询性能低下的最基本的原因就是访问了太多的数据. 3. ...
- iOS UILocalNotification 每2周,每两个月提醒
iOS 的UILocalNotification提醒提供了默认的重复频率,比如,一天,一个星期等等,但是对于非标准的频率,比如每,2周,每2个月,无法重复提醒. 我们的思路是在应用程序开始时,把即将发 ...
- DELPHI控件:DBLookupComboBOX组件的使用方法
在许多数据表中,数据是以代码方式存放的,如在班级编码数据表tB03(表5.5)中,系部字段TB0309采用编码方式存放,系部真实名称则存放在系部编码表TB06.使用代码的好处是,用户可在编码表TB06 ...
- Match:DNA repair(POJ 3691)
基因修复 题目大意:给定一些坏串,再给你一个字符串,要你修复这个字符串(AGTC随便换),使之不含任何坏串,求修复所需要的最小步数. 这一题也是和之前的那个1625的思想是一样的,通过特殊的trie树 ...
- [Android Pro] static 和 Volatile 的区别
reference to : http://blog.sina.com.cn/s/blog_4e1e357d0101i486.html static也是各个业务方可以去全局修改: volatile是处 ...
- 4.3 map和multimap
使用map multimap必须包含头文件map *:multimap 1)multimap定义 template<class Key,class Pred=less<Key>,cl ...
- I2C学习
详细的解释: 读写状态机图
- EmguCV学习 与opencv的区别和联系
openCV是因特尔的一个开源的视觉库,里面几乎包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作.不过opencv有 ...