quartz学习一--入门

一、概述
    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 .



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值