quartz学习一--入门

原创 2016年06月01日 15:24:12
一、概述
    1、简介
       (1)、项目创立于1998年, 不间断更新,活跃度高。

       (2)、纯Java设计,设计用于JavaSE、JavaEE, 方便集成于:JVM、JMI

       (3)、官网
            http://www.quartz-scheduler.org/

       (4)、cron表达式辅助工具
            http://www.cronmaker.com/    

    2、功能
       (1)、核心概念
            scheduler                                --->        调度器

            trigger                                --->        触发器

            job                                    --->        调度任务对象

            jobDetail                                --->        调度任务描述

            listener                                --->        调度监听

            calendar                                --->        调度时间点

       (2)、支持集群
            org.quartz.jobStore.isClustered

       (3)、支持任务恢复
            requestsRecovery

    3、示例
       // (1)、通过SchedulerFactory构建Scheduler对象  
       Scheduler sched = sf.getScheduler();  

       // (2)、声明 CronTrigger 触发器
       CronTrigger trigger = new CronTrigger("helloWorldTrigger", "cronGroup", "1/1 * * * * ?");  

       // (3)、声明  JobDetail(将 job 等属性赋值给JobDetail)
       JobDetail job = new JobDetail("helloWorldJob", Scheduler.DEFAULT_GROUP, HelloWorldJob.class);

       // (4)、工厂模式,组装各个组件<JOB,Trigger>  
       sched.scheduleJob (job, trigger);  
 
       // (5)、start   
       sched.start();  

    4、流程图
       (1)、创建调度工厂                            --->        工厂模式

       (2)、根据工厂取得调度器实例                        --->        工厂模式

       (3)、Builder模式构建子组件<Job,Trigger>                    --->        builder模式, 如JobBuilder、TriggerBuilder、DateBuilder

       (4)、通过调度器组装子组件,调度器.组装<子组件1,子组件2...>        --->        工厂模式

       (5)、调度器.start                            --->        工厂模式

二、入门(居于 Quartz 1.*)
    1、目录结构和内容
       docs/api                                    --->        Quartz 框架的JavaDoc Api 说明文档

       docs/dbTables                                --->        创建 Quartz 的数据库对象的脚本

       docs/wikidocs                                --->        Quartz 的帮助文件,点击 index.html 开始查看

       Examples                                    --->        多方面使用 Quartz 的例子Lib Quartz 使用到的第三方包

       src/java/org/quartz                            --->        使用 Quartz 的客户端程序源代码,公有 API

       src/java/org/quartz/core                            --->        使用 Quartz 的服务端程序源代码,私有 API

       src/java/org/quartz/simpl                        --->        Quartz 提供的不衣赖于第三方产品的简单实现

       src/java/org/quartz/impl                            --->        依赖于第三方产品的支持模块的实现

       src/java/org/quartz/utils                        --->        整个框架要用到的辅助类和工具组件

       注:Quartz 框架包含许多的类和接口,它们分布在大概 11 个包中。多数所要使用到的类或接口放置在 org.quartz 包中。这个包含盖了 Quartz 框架的公有 API.

    2、Scheduler
       (1)、作用
            负责对用户定义的所有任务进行调度的类

       (2)、SchedulerFactory                            --->        调度工厂
            a、StdSchedulerFactory
           Quartz默认的SchedulerFactory,依赖于属性类(Properties)决定如何生产 Scheduler 实例

           properties加载顺序:
           检查 System.getProperty("org.quartz.properties") 中是否设置了别的文件名

           使用 quartz.properties 作为要加载的文件名

           试图从当前工作目录中加载这个文件

           试图从系统 classpath 下加载这个文件
           
           Quartz jar包中有一个默认的 quartz.properties 文件

            b、DirectSchedulerFactory
           对SchedulerFactory的直接实现, 通过它可以直接构建Scheduler、threadpool 等

           -- 最简单  
           public void createScheduler(ThreadPool threadPool, JobStore jobStore);  

           -- 最复杂  
           public void createScheduler(String schedulerName, String schedulerInstanceId,ThreadPool threadPool, JobStore jobStore, String rmiRegistryHost, int rmiRegistryPort);  

       (3)、Scheduler
            a、启动 Scheduler
           scheduler.start();
        
            b、销毁 Scheduler
           scheduler.shutdown();

            c、StdScheduler
           Quartz默认的Scheduler

            d、RemoteScheduler
           带有RMI功能的Scheduler

    3、Trigger
       (1)、作用
            描述触发Job执行的时间触发规则。

        调度类(Scheduler)在 特定时间 调用此类,再由trigger类调用指定的定时程序。

       (2)、SimpleTrigger
            a、作用
           用于按频率调度 指定任务

            b、常用属性
           jobDetail        --->        指定调度任务

           repeatInterval        --->        指定间隔时间

           repeatCount        --->        指定次数,默认无穷次

           startDelay        --->        指定延迟多少毫秒启动调度,默认立即
           
           startTime        --->        指定某个时间点启动调试,默认立即

       (3)、CronTriggerBean
            a、作用
           用于按时间点调度 指定任务;使用Linux的Cron表达式 定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成
           
            b、常用属性
           jobDetail        --->        指定调度任务

           cronExpression        --->        指定重复执行的时间点

            c、cron表达式
           字段        允许值            允许的特殊字符

           秒        0-59            , - * /

           分        0-59            , - * /

           小时        0-23            , - * /

           日期        1-31            , - * ? / L W C

           月份        1-12 或者 JAN-DEC    , - * /

           星期        1-7 或者 SUN-SAT    , - * ? / L C #

           年(可选)        留空, 1970-2099    , - * /

           注:星期与日期不可同时指定。

            d、cron特殊字符
           *            --->        表示任意
           ?            --->        表示不设置
           -            --->        表达一个范围
           ,            --->        表达一个列表值
           /            --->        x/y表达一个等步长序列,x为起始值,y为增量步长值
           L            --->        该字符只在日期和星期字段中使用,代表“Last”的意思
           W            --->        该字符只能出现在日期字段里,表示离该日期最近的工作日
           LW组合            --->        在日期字段可以组合使用LW,它的意思是当月的最后一个工作日
           #            --->        该字符只能在星期字段中使用,表示当月某个工作日:  6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个)
           C            --->        该字符只在日期和星期字段中使用,计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期:  5C在日期字段中就相当于日历5日以后的第一天

       (4)、其他 Trigger(不同版本有不同扣展)
            DateIntervalTrigger                            --->        日期间隔触发的Trigger

    4、JOB 接口                                    --->        调度任务接口
       (1)、作用
            触发器在被触发后进行的操作,可以指定任意一个类的某个方法。

       (2)、JobExecutionContext
            JOB上下文,保存着Trigger、 JobDetail 等信息

       (3)、定义的方法
            public void execute(JobExecutionContext context) throws JobExecutionException;

       (4)、JobDetail
            a、作用
           描述Job的实现类及其它相关的静态信息。
           
            b、原理(看参见 "一、3、(3)")
           Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job

            c、作用
           JobDetail不存储Job的实例,但它允许你定义一个实例,JobDetail 又指向JobDataMap

           JobDetail持有Job的详细信息,如它所属的组,名称等信息

       (4)、JobDataMap
            a、作用
           保存着任务实例的对象,并保持着他们状态信息,它是Map接口的实现,即你可以往里面put和get一些你想存储和获取的信息.

            b、使用
           JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();

           注: 在Quartz 1.5之后,JobDataMap在 Trigger 级也是可用的。
               实际使用中trigger级别有时取不到map中的值, 使用getMergedJobDataMap 可以获取到

       (5)、StatefulJob
            a、作用
           代表有状态的任务,该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。
           
            b、与Job的区分
           无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会影响下次的执行。

           有状态任务共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。

           无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行: 如果前次的StatefulJob还没有执行完毕,下一次的任务将阻塞等待,直到前次任务执行完毕。

       (6)、原生Job实现
            org.quartz.jobs.FileScanJob                        --->        检查某个指定文件是否变化,并在文件被改变时通知到相应监听器的 Job
            org.quartz.jobs.FileScanListener                    --->        在文件被修改后通知 FileScanJob 的监听器
            org.quartz.jobs.NativeJob                        --->        用来执行本地程序(如 windows 下 .exe 文件) 的 Job
            org.quartz.jobs.NoOpJob                        --->        什么也不做。一些用户甚至仅仅用它来导致一个监听器的运行
            org.quartz.jobs.ee.mail.SendMailJob                    --->        使用 JavaMail API 发送 e-mail 的 Job
            org.quartz.jobs.ee.jmx.JMXInvokerJob                --->        调用 JMX bean 上的方法的 Job
            org.quartz.jobs.ee.ejb.EJBInvokerJob                --->        用来调用 EJB 上方法的 Job
       
       注:一个job可以对应多个Trgger , 一个Trigger只能对应一个job .



版权声明:本文为博主原创文章,未经博主允许不得转载。

Quartz 入门详解

概述 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的MIS系统来说,在每月Java开源的好处就是:领域问题都能找到现成的解决方案。 2001年发布版本以来已经被众...
  • wenniuwuren
  • wenniuwuren
  • 2014年11月25日 16:17
  • 3890

Quartz框架入门学习(一)

Quartz的使用
  • u014705021
  • u014705021
  • 2016年11月13日 14:23
  • 3258

Quartz学习——Quartz简单入门Demo(二)

要学习Quartz框架,首先大概了解了Quartz的基本知识后,在通过简单的例子入门,一步一个脚印的走下去。 下面介绍Quartz入门的示例,由于Quartz的存储方式分为RAM和JDBC,分别对这...
  • u010648555
  • u010648555
  • 2017年02月04日 15:55
  • 6785

quartz学习入门(一)

第一个最简单的Quartz demo
  • u012385432
  • u012385432
  • 2014年08月15日 15:36
  • 473

【Quartz】Quartz概述及入门实例

Quartz 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。此外...
  • Evankaka
  • Evankaka
  • 2015年04月29日 08:57
  • 5052

quartz入门及通用型自定义定时任务框架

一 Quarta介绍 1 Quartz是什么 Quartz就是一个纯 Java 实现的作业调度工具,相当于数据库中的 Job、Windows 的计划任务、Unix/Linux 下的 Cron,但 ...
  • slowdownthenrunfast
  • slowdownthenrunfast
  • 2014年07月22日 16:26
  • 1744

Quartz学习,入门到精通

Quartz学习 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行。 运行环境 · Quartz 能嵌入在其他应用程序里运行。  · Quartz 能在一个...
  • w451373766
  • w451373766
  • 2011年12月20日 11:59
  • 1002

ActiveMQ从入门到精通(三)

这是ActiveMQ系列的最后一篇文章,主要是关于ActiveMQ集群,这里采用的方式是:Zookeeper+LevelDB+ActiveMQ。前面2篇博客地址如下:《ActiveMQ从入门到精通(一...
  • jek123456
  • jek123456
  • 2017年05月19日 09:36
  • 643

MFC入门学习(1)了解MFC

MFC是Mircrosoft fundaction Class的简称,它是一组预定义的类,它封装了Win32功能。     在通常情况下,我们学习VC的过程都是直接使用WindowsAPI开发应用程...
  • codectq
  • codectq
  • 2014年02月12日 21:13
  • 7596

uboot入门 | 使用 | 学习

1、编译uboot 1.1(OK6410开发板)执行命令   make forlinx_nand_ram256_config 以下为各个开发板编译uboot的对应命令 TQ210:    mak...
  • u011467781
  • u011467781
  • 2015年02月05日 17:37
  • 1349
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:quartz学习一--入门
举报原因:
原因补充:

(最多只允许输入30个字)