一、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实例,如:

  1. public class DDNJob implements Job{
  2. public void execute(JobExecutionContext arg0) throws JobExecutionException {
  3. perform();
  4. }
  5. public void perform(){ //执行报表统计入口函数
  6. //业务逻辑
  7. System.out.println("自动DDN预授权开始执行-------------执行时间:"+new Date());
  8. }
  9. }

注:DDNJob类为需要定时执行的类,execute为定时执行的方法。一个定时任务对应一个Job实现类。

2、JobDetail

Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。JobDetail 用来保存我们作业的详细信息。一个JobDetail可以有多个Trigger,但是一个Trigger只能对应一个JobDetail,

示例:

  1. 1.  JobDetail jobDetail = new JobDetail("myJob","myGroup",DDNJob.class)
  2. 2.  说明:
  3. 3.  myJob:job 名
  4. 4.  myGroup:job 组(为'null'时,使用缺省的组sched.DEFAULT_GROUP)
  5. 5.  DDNJob.class:要被执行的Java类。

运用spring集成的MethodInvokingJobDetailFactoryBean时spring能自动生成符合quartz要去的JobDetail。
Spring中applicationContext.xml配置如下:

  1. <!-- detail任务描述 -->
  2. <bean name="DDNDetail"
  3. class="com.mangocity.mpm.common.autoDDN.MethodInvokingJobDetailFactoryBean">
  4. <property name="targetObject" value="DDNJob" />
  5. <property name="concurrent" value="false"/>(并发执行)
  6. <property name="shouldRecover" value="true"/>
  7. </bean>

3、Trigger

Trigger是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和 CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则 可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;Spring中applicationContext.xml配置如下:

SimpleTrigger使用示例:

  1. // Initiate SimpleTrigger with its name and group name
  2. SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger","triggerGroup1");
  3. // set its start up time
  4. simpleTrigger.setStartTime(new Date(System.currentTimeMillis()));
  5. // set the interval, how often the job should run (10 seconds here)
  6. simpleTrigger.setRepeatInterval(10000);
  7. // set the number of execution of this job, set to 10 times.
  8. simpleTrigger.setRepeatCount(10);

通过Spring配置,jobDetail为配置的Job描述,startDelay为系统启动执行延迟时间,repeatCount为调用次数,repeatInterval为Job触发时间间隔。

  1. <bean id="DDNSimpletrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  2. <property name="jobDetail" ref="DDNDetail"/>
  3. <property name="startDelay" value="1"/>
  4. <property name="repeatCount" value="100"/>
  5. <property name="repeatInterval" value="1000"/>
  6. </bean>

CronTrigger使用示例:

  1. // Initiate CronTrigger with its name and group name
  2. CronTrigger cronTrigger = new CronTrigger("cronTrigger","triggerGroup2");
  3. try {
  4. // setup CronExpression
  5. CronExpression cexp = new CronExpression("0/5 * * * * ?");
  6. // Assign the CronExpression to CronTrigger
  7. cronTrigger.setCronExpression(cexp);
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }

通过Spring配置,jobDetail为配置的Job描述,cronExpression为Job的运行规则,具体见附录部分内容。

  1. <bean id="DDNCrontrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  2. <property name="jobDetail" ref="DDNDetail"/>
  3. <property name="cronExpression" value="0/5 * * ? * * *"/>
  4. </bean>

4、Scheduler

Scheduler负责管理Quartz的运行环境,Quartz它是基于多线程架构的,它启动的时候会初始化一套线程,这套线程会用来执行一些预置的作业。Trigger和JobDetail可以注册到Scheduler中;Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。         Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。 应用示例:

  1. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  2. // Retrieve a scheduler from schedule factory
  3. Scheduler scheduler = schedulerFactory.getScheduler();
  4. // schedule a job with JobDetail and Trigger
  5. scheduler.scheduleJob(jobDetail, simpleTrigger);
  6. // start the scheduler
  7. scheduler.start();

Spring中applicationContext.xml配置:

  1. <!-- 调度器  -->
  2. <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  3. <property name="dataSource">
  4. <ref bean="dataSource"/>
  5. </property>
  6. <property name="triggers">
  7. <list>
  8. <!--  触发器列表 -->
  9. <!-- <ref bean="DDNcronTrigger" />  -->
  10. <ref bean="DDNSimpletrigger" />
  11. </list>
  12. </property>
  13. <property name="configLocation" value="classpath:quartz.properties" />
  14. </bean>

其中,dataSource为数据源配置,triggers为触发器列表配置,可以同时包含多个trigger,configLocation为quartz配置文件quartz.properties加载路径。

四、总结:

我们不只有一种两种方法来实现我们的定时任务,就我知道的出了我们的quartz框架之外,我们spring也自己封装有自己的定时器,再加上各种开源的插件。那我工作的公司来说,我们用windows服务来完成这个定时任务,万变不离其宗,理解了他们的原理以及精髓,我们就可以去创新,去写出符合自己要求的工具了!

 
好文要顶 关注我 收藏该文  

Quartz框架介绍的更多相关文章

  1. (2)Spring集成Quartz定时任务框架介绍和Cron表达式详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  2. Spring集成Quartz定时任务框架介绍和Cron表达式详解

    原文地址:http://www.cnblogs.com/obullxl/archive/2011/07/10/spring-quartz-cron-integration.html 在JavaEE系统 ...

  3. Spring_Spring集成Quartz定时任务框架介绍和Cron表达式详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  4. Spring集成Quartz定时任务框架介绍

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  5. [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍

    [连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目       录 第一章           通讯框架介绍... 2 1.1           通讯的本质... 2 1 ...

  6. [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续

    英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...

  7. [译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架

    第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可 ...

  8. iOS框架介绍

    iOS框架介绍      Cocoa Touch   GameKit  实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息  iOS设备之间蓝牙数据传输   从iOS7开始过期   局域网游 ...

  9. Quartz框架多个trigger任务执行出现漏执行的问题分析--转

    原文地址:http://blog.csdn.net/dailywater/article/details/51470779 一.问题描述 使用Quartz配置定时任务,配置了超过10个定时任务,这些定 ...

随机推荐

  1. 【FFMPEG】ffmpeg 中添加264支持

    ffmpeg 中带有264的解码,没有编码,需要添加x264: 参考百度上的"windows_ffmpeg编译 " 文档 下载ffmpeg 代码合x264代码, ffmpeg 代码 ...

  2. linux netstat 查看网络连接状况

    netstat -lnpnetstat -an |grep 127.0.0.1 tcp 0.0.0.0:* LISTEN tcp 0.0.0.0:* LISTEN [root@wang /]# net ...

  3. VMware Windows Server 2008 R2 X64 虚拟机安装教程

    首先进入VMware Workstation中,点击创建新的虚拟机 然后按如下步骤操作 然后进去选择拷贝的Windows 2008的映像文件 下面这个网址里面提供了各种映像文件的下载http://is ...

  4. PYTHON 100days学习笔记008-3:输入和输出

    目录 Day008-03:Python3 输入和输出 1.输出格式美化 1.1 str.format()用法 1.2 旧式字符串格式化 2.读取键盘输入 3.读和写文件 4.文件对象的方法 4.1 f ...

  5. spring websocket 使用@SendToUser

    spring websocket 使用@SendToUser 原文链接:https://blog.csdn.net/yingxiake/article/details/51224569 之前我们利用@ ...

  6. java中JDBC是什么?

    [学习笔记] JDBC是什么? JDBC即(java database connectivity数据连接).JDBC是Sun公司编的一堆类和方法,都封装在java.sql包中.你可以利用这堆类和方法来 ...

  7. 安装matplotlib,报错ERROR: Command errored out with exit status 1:

    使用pip install matplotlib 出现报错信息: 发现这行报错 : 我是在pycharm上安装的,可是提示我去安装 Microsoft Visual C++ ,然后去百度查了下,发现只 ...

  8. Kernel--试题

    1. 内核堆栈区别: 1.栈自动分配回收,函数里面声明的变量:2.堆:malloc kmalloc申请的空间,需要自己释放 https://blog.csdn.net/tainjau/article/ ...

  9. NOIP比赛中如何加速c++的输入输出

    NOIP比赛中如何加速c++的输入输出 在竞赛中,遇到大数据时,往往需要更快的读取方式.由于比赛中输出一般规模较小,本文只讨论输入如何加速. 现在我们生成1000000个随机数,构成1000*1000 ...

  10. 深入理解Java自动装箱拆箱机制

    1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer): 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int). Java中 ...