`

Quartz工作原理

阅读更多

原文地址:http://www.hxstrive.com/article/385.htm

 

核心概念

 

Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便。Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。

1、Job

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

1

void execute(JobExecutionContext context)

 

2、JobDetail

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

 

3、Trigger 

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

 

4、Scheduler

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 是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。

 

总结

 

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,这样就能产生动态的调度。

 

分享到:
评论

相关推荐

    quartz工作原理

    quartz工作原理

    深入解读Quartz的原理

    深入解读Quartz的原理,定时任务框架是web开发过程中使用很多的框架之一

    Quartz任务调度管理

    Quartz任务调度:根据时间,执行任务。 Quartz工作原理 1) 任务:需要执行的具体工作。 2) 触发器:在特定的时间触发任务的执行。 3) 调度器:任务的实际执行者,负责粘合任务和触发器。

    Quartz原理及实例

    Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例

    quartz集群调度机制调研及源码分析

    quartz集群调度机制调研及源码分析,基于quartz 1.7版本

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

    Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便,下面我们看看如何使用它

    Quartz-2.0.2 CSDN下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架...这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖一套松耦合的线程池管理部件来管 理线程环境。

    Quartz.NET-2.0

    这就是Quartz.NET怎样能并发运行多个作业的原理。Quartz.NET依赖一套松耦合的线程池管理部件来管理线程环境。作业是一个执行任务的简单.NET类。只需实现Quartz.IJob接口,IJob接口包含唯一的一个方法Execute(),作业...

    Quartz-1.8.6 CSDN 下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架...这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖一套松耦合的线程池管理部件来管理线程环境。

    Quartz-2.2.3 CSDN 下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架...这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖一套松耦合的线程池管理部件来管理线程环境。

    Quartz-2.1.7 CSDN 下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架...这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖一套松耦合的线程池管理部件来管理线程环境。

    任务调度框架Quartz原理简介

    Quartz是OpenSymphony开源组织的一个Java开源项目,在2009被Terracotta收购。Quartz官网 Quartz任务调度的主要元素有: Trigger(触发器) Scheduler(任务调度器) Job(任务) 其中Tri

    Quartz集群原理以及配置应用的方法详解

    Quartz是Java领域最著名的开源任务调度工具。Quartz提供了极为广泛的特性如持久化任务,集群和分布式任务等,下面这篇文章主要给大家介绍了关于Quartz集群原理以及配置应用的相关资料,需要的朋友可以参考下

    Quartz使用总结

    Quartz的原理简介,可以实现任务的调度和定时的添加,在文中给了基础的使用方法的代码展示!!!!

    quartz动态控制定时任务

    Quartz的工作原理是通过Job和Trigger两个核心概念来实现的,Job是具体需要执行的任务,Trigger用来触发任务的执行时机。在Quartz中,可以通过定义各种Trigger来实现不同的调度策略,如简单调度、Cron调度等。Quartz...

    Quartz多线程示例.rar

    Quartz使用StdSchedulerFactory(调度器工厂)实现多线程原理,可以自定义线程个数来实现不同的需求,代码中有详细注释说明

    Quartz-2.2.1 CSDN 下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架...这就是Quartz怎样能并发运行多个作业的原理。 Quartz依赖一套松耦合的线程池管理部件来管理线程环境。

    Spring攻略(第二版 中文高清版).part2

    1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 ...

    Spring攻略(第二版 中文高清版).part1

    1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 ...

    P2P网络借贷平台项目SSH+Redis+ActiveMQ+POI+Shiro+AngularJS+Nginx+Quartz等

    10、后台权限采用流行的shiro权限管理框架,通过本项目可以深入了解shiro权限框架的应用及原理。 11、项目部署采用tomcat+Nginx的集群部署方式,在部署过程中可以深刻体会到nginx在负载均衡中发挥的优势。

Global site tag (gtag.js) - Google Analytics