• Quartz学习 之 入门


    一、什么是 Quartz Scheduler

      Quartz Scheduler是一个特性丰富、开源的一个任务调度库,可以应用于所有的Java App。Quartz 可以创建简单和复杂的任务调度,可以执行几十、几百、上万个任务。任务被定义成标准的Java组件,可以执行任意的程序。Quartz Scheduler支持很多企业特性,譬如说 JTA事物和集群。

    二、我们用 Quartz Scheduler 能做什么

      在你的应用中,有很多任务需要在时间的某一个时刻发生,或者有很多循环发生的任务,Quartz Scheduler 将会是你理想中的选择。

      1. Driving Process Workflow(驱动流程工作流):当一个新的秩序被初始化好,调度一个job在两个小时内触发,将会检查秩序的状态,如果某一个需要确认的信息还没有收到,就触发一个预警消息,同时将秩序的状态更新为 ‘等待调停’。

      2. 系统维护:在每天的某个固定的时间,将数据库的内容变成一个xml文件。

      3. 在应用中,提供提醒的服务。

    三、Quartz 的特性

      特性一:Runtime Environments (运行时环境)

        1. Quartz 可以被植入到另外一个自由独立的应用中。

        2. Quartz 可以在应用中初始化,参入到XA 事物中。

        3. Quartz 可以作为一个独立的程序运行,譬如被使用到 远程接口调用中。

        4. Quartz 可以初始化为一个 job执行的独立程序的集群。

      特性二:Job Scheduling(任务跳读)

         当触发器发生,任务可以被调度执行。触发器包含以下指令:

          1. 一天中某一个时间。

          2. 一个星期的某一个时间。

          3. 一个月的某一个时间。

          4. 一年中的某一个时间。

          5. 注册的Calendar 列出来某一些不确定的时间(国庆节等)。

          6. 在某一段时间内重复一定的次数。

          7. 一直重复,直到某一个结束时间。

          8. 无限期的重复。

          9. 重复的延迟间隔。

          创建Job的时候可以给Job一个名称,然后放到一个组(group)中。触发器也可以有名称,放入到一个组里面,这样scheduler 就可以很好的去管理他们。Job可以加入到scheduler一次,但是可以注册到触发器多次。在企业Java环境中,Job可以执行的工作可以作为分布式事物中的一部分。

      特性三:Job Execution(任务执行)

          1. Job可以是实现了 Job接口的任意类。

          2. Job类的实例可以被Quartz初始化,也可以被你的Java应用初始化。

          3. 当触发器发生的时候,调度器可以通知零个或者多个实现了 JobListener 和 TriggerListener 接口的java对象。当Job已经执行的时候,这些监听器也会被唤醒。

          4. 当Job执行完成的时候,会返回一个 JobCompletionCode,通知调度器任务完成或者失败。JobCompletionCode可以来知道调度器接下来的一些动作。

      特性四:Job Persistence(Job持久化)

        1. 在Quartz的设计中,提供了一个 JobStore 接口,实现这个接口可以提供好各种各样机理的Job存储。

        2. 在使用 JDBCJobStore 时,所有的 Job 和 trgger 配置为 ‘non-volatile’,通过Jdbc保存在数据库中。

        3. 在使用 RAMJobStore 时,所有的 Job 和 trgger 保存在内存中,因此在程序执行的时候,没有持久化。

      特性五:Transactions(事物)

        1. 使用 JobStoreCMT , Quartz可以加入到 JTA 事物中。

        2. Quartz可以管理 Job执行上下文的 JTA 事物,所以 Job所执行的任务 会 在一个 JTA 事物中。

      特性六: Clustering Features(集群的特性)

        1. 提供了 容错机制。

        2. 提供了负载均衡机制。

        3. Quartz 的 集群特性 依赖于 数据库持久(由JDBCJobStore 实现的)。

        4. Terracotta  扩展了 Quartz, 提供了集群的能力而不需要后端的数据库。

      特性七:Listeners & Plug-Ins(监听器和插件)

        1. 应用可以捕获到 调度的事件,从而可以监听和控制 Job和Trgger 的行为。

        2. 插件的机理 可以 给 Quartz 增加一些功能,例如: 保存Job执行的历史记录,从文件中加载 Job 和 触发器。

        3. Quartz 提供了 一些工厂方法,可以创建 一些 插件和监听器。

      四、 Quartz 的一个简单应用Demo

        Job的实现代码:

    package net.qh.test.job;
    
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    
    /**
     * Created by Administrator on 2016/03/28.
     */
    public class MyJob implements Job {
        @Override
        public void execute(JobExecutionContext jobExecutionContext) {
    
            String msg = " hello My Job, fire-time:"+jobExecutionContext.getFireTime()
                    +", InstanceId:"+jobExecutionContext.getFireInstanceId()
                    +", JobRunTime: "+jobExecutionContext.getJobRunTime()
                    +", key:"+jobExecutionContext.getMergedJobDataMap().get("key");
            System.out.println(msg);
        }
    }
    

      Main方法:

    package net.qh.test.job;
    
    import org.quartz.*;
    import org.quartz.impl.StdSchedulerFactory;
    
    import java.util.Collections;
    
    /**
     * Created by Administrator on 2016/03/28.
     */
    public class Demo {
    
        public static void main(String[] args) throws SchedulerException {
            Scheduler scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.start();
    
            JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                    .usingJobData(new JobDataMap(Collections.singletonMap("key","value")))
                    .withIdentity("myJob", "myGroup")
                    .build();
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "myGroup")
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
                    .build();
            scheduler.scheduleJob(jobDetail,trigger);
        }
    
    }
    

      运行输出:

    log4j:WARN No appenders could be found for logger (org.quartz.impl.StdSchedulerFactory).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
     hello My Job, fire-time:Tue Mar 29 13:57:24 GMT+08:00 2016, InstanceId:1459231044819, JobRunTime: -1, key:value
     hello My Job, fire-time:Tue Mar 29 13:57:29 GMT+08:00 2016, InstanceId:1459231044820, JobRunTime: -1, key:value
     hello My Job, fire-time:Tue Mar 29 13:57:34 GMT+08:00 2016, InstanceId:1459231044821, JobRunTime: -1, key:value
     hello My Job, fire-time:Tue Mar 29 13:57:39 GMT+08:00 2016, InstanceId:1459231044822, JobRunTime: -1, key:value
     hello My Job, fire-time:Tue Mar 29 13:57:44 GMT+08:00 2016, InstanceId:1459231044823, JobRunTime: -1, key:value
     hello My Job, fire-time:Tue Mar 29 13:57:49 GMT+08:00 2016, InstanceId:1459231044824, JobRunTime: -1, key:value
    

      

  • 相关阅读:
    [HDU3555]Bomb
    [POJ3096]Surprising Strings
    [POJ1068]Parencodings
    [POJ3295]Tautology
    [POJ2586]Y2K Accounting Bug
    [POJ2109]Power of Cryptography
    [POJ1328]Radar Installation
    Binary search tree system and method
    ES6详解八:模块(Module)!--各种导入导出方法
    java在cmd下编译和执行引用jar的类
  • 原文地址:https://www.cnblogs.com/aDiot/p/5332150.html
Copyright © 2020-2023  润新知