Quartz学习之入门学习

简介

Quartz是一个开源的做业调度框架,可让计划的程序任务一个预约义的日期和时间运行。Quartz能够用来建立简单或复杂的日程安排执行几十,几百,甚至是十万的做业数。
官方连接,戳这里html

Quartz是什么?

做业调度库

Quartz 是一种功能丰富的,开放源码的做业调度库,能够在几乎任何Java应用程序集成 - 从最小的独立的应用程序到规模最大电子商务系统。Quartz能够用来建立简单或复杂的日程安排执行几十,几百,甚至是十万的做业数 - 做业被定义为标准的Java组件,能够执行几乎任何东西,能够编程让它们执行。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。java

Quartz 是可自由使用,使用Apache 2.0 license受权方式。数据库

做业调度

若是应用程序须要在给定时间执行任务,或者若是系统有连续维护做业,那么Quartz是理想的解决方案。编程

做业被安排在一个给定的触发时运行。触发器可使用如下指令的接近任何组合来建立:负载均衡

  • 在一天中的某个时间(到毫秒)
  • 在一周的某几天
  • 在每个月的某一天
  • 在一年中的某些日期
  • 不在注册的日历中列出的特定日期(如商业节假日除外)
  • 重复特定次数
  • 重复进行,直到一个特定的时间/日期
  • 无限重复
  • 重复的延迟时间间隔

做业是由其建立者赋予的名字,也能够组织成命名组。触发器也能够给予名称和放置在组中,以方便地将它们调度内组织。做业能够被添加到所述调度器一次,而是具备多个触发器注册。在企业Java环境中,做业能够执行本身的工做做为分布式(XA)事务的一部分。框架

集群

  • 故障切换
  • 负载均衡
  • Quartz的内置的群集功能,经过JDBCJobStore依靠数据库持久
  • Terracotta扩展Quartz提供集群功能,而不须要一个支持数据库

使用的 jar 包

  • quartz-2.2.1.jar
  • quartz-jobs-2.2.1.jar

三个重要的概念简介

Scheduler

调度器。全部的调度都是由它控制。调度类连接“工做”和“触发器”到一块儿,并执行它。分布式

scheduler 实例化后,能够启动(start)、暂停(stand-by)、中止(shutdown)。注意:scheduler 被中止后,除非从新实例化,不然不能从新启动;只有当 scheduler 启动后,即便处于暂停状态也不行,trigger 才会被触发(job才会被执行)ide

Scheduler的生命期,从SchedulerFactory建立它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被建立后,能够增长、删除和列举Job和Trigger,以及执行其它与调度相关的操做(如暂停Trigger)。可是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)函数

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);

Scheduler的主要函数:测试

  • start():启动
  • standby():挂起
  • shutdown():关闭
  • shutdown(true)表示等待全部正在执行的job执行完毕后,在关闭scheduler
  • shutdown(false)即shutdown()表示直接关闭scheduler

注意关闭以后,scheduler不能重新开启,会抛出异常

Trigger

Trigger用于触发Job的执行。当你准备调度一个job时,你建立一个Trigger的实例,而后设置调度相关的属性。Trigger也有一个相关联的JobDataMap,用于给Job传递一些触发相关的参数。Quartz自带了各类不一样类型的Trigger,最经常使用的主要是SimpleTrigger和CronTrigger。

  • SimpleTrigger – 容许设置开始时间,结束时间,重复间隔。主要用于一次性执行的Job(只在某个特定的时间点执行一次),或者Job在特定的时间点执行,重复执行N次,每次执行间隔T个时间单位。
  • CronTrigger – 容许UNIX cron表达式来指定日期和时间来运行做业。在基于日历的调度上很是有用,如“每一个星期五的正午”,或者“每个月的第十天的上午10:15”等。

SimpleTrigger – 每5秒运行

Trigger trigger = TriggerBuilder
    .newTrigger()
    .withIdentity("dummyTriggerName", "group1")
    .withSchedule(
        SimpleScheduleBuilder.simpleSchedule()
        .withIntervalInSeconds(5).repeatForever())
    .build();

CronTrigger – 每5秒运行。

Trigger trigger = TriggerBuilder
    .newTrigger()
    .withIdentity("dummyTriggerName", "group1")
    .withSchedule(
        CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
    .build();

JobDetail & Job

JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中。

JobDetail对象是在将job加入scheduler时,由客户端程序(你的程序)建立的。它包含job的各类属性设置,以及用于存储job实例状态信息的JobDataMap。

例子说明

1.下载 jar 包

能够从官方网站或 Maven 中央存储库下载 Quartz 库文件;

2.建立一个做业

HelloJob.java

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Hello Quartz!");
    }
}

3.建立触发器,以及经过调度执行做业

SimpleTrigger.java

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleTrigger {

    public static void main(String[] args) throws Exception {

        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("dummyJobName", "group1").build();

         // 定义一个Trigger
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName", "group1")        // 定义 name/group
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(5).repeatForever())
                .build();
        
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

CronTrigger.java

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class CronTrigger {

    public static void main(String[] args) throws Exception {
        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("dummyJobName", "group").build();

        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyJobName", "group")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

输出的结果以下:

每隔五分钟就会打印出一条 Hello Quartz!

Hello Quartz!
Hello Quartz!
Hello Quartz!

Quartz 的其余概念

JobExecutionContext

  • 当 Schedule 调用一个 Job,就会将 JobExecutionContext 传递给 Job 的 execute() 方法
  • Job 能经过 JobExecutionContext 对象访问到 Quartz 运行时候的环境以及 Job自己的明细数据

JobDataMap

  • 在进行任务调度时 JobDataMap存储在JobExecutionContext中,很是方便获取
  • JobDataMap 能够用来装载任何可序列化的数据对象,当job 实例对象被执行时这些参数对象会传递给它
  • JobDataMap实现了JDK的Map接口,而且添加了一些很是方便的方法用来存取数据基本类型

key

  • 将Job和Trigger注册到Scheduler时,能够为它们设置key,配置其身份属性。
  • Job和Trigger的key(JobKey和TriggerKey)能够用于将Job和Trigger放到不一样的分组(group)里,而后基于分组进行操做。
  • 同一个分组下的Job或Trigger的名称必须惟一,即一个Job或Trigger的key由名称(name)和分组(group)组成。

实例说明

第一步:建立一个 Job。

在这个类中,咱们经过 JobExecutionContext 来获取 JobDataMapkey以及经过自定义传入的信息。代码中有备注,仔细看下就知道了。

HelloJob.java

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Hello Quartz!");
        
        // 获取 JobDetail 的 key 和 group
        JobKey key = context.getJobDetail().getKey();
        System.out.println("JobDetail key name: "+key.getName());
        System.out.println("JobDetail key Group: "+key.getGroup());
        
        // 从 JobExecutionContext 中获取一个实例,  获取从 jobDetail 传入的数据
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        String JobMsg = dataMap.getString("message");
        Float floatMsg = dataMap.getFloat("floatData");
        System.out.println("JobDetial:"+ JobMsg);
        System.out.println("floatMsg:"+ floatMsg);
        
        //获取 trigger 的 key 和 group
        TriggerKey triggerKey = context.getTrigger().getKey();
        System.out.println("TriggerKey key name: "+triggerKey.getName());
        System.out.println("TriggerKey key Group: "+triggerKey.getGroup());
        
        // 获取一个 trigger 的 jobDataMap 实例
        JobDataMap triggerMap = context.getTrigger().getJobDataMap();
        String triggerMsg = dataMap.getString("message");
        System.out.println("triggerMsg:"+ triggerMsg);
    }
}

第二步:测试类

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleTrigger {

    public static void main(String[] args) throws Exception {

        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("dummyJobName", "group1")
                .usingJobData("message", "hello myJob1")    //传入自定义的数据
                .usingJobData("floatData", 1.2F)
                .build();

         // 定义一个Trigger
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName", "group1")        // 定义 name/group
                .usingJobData("message", "hello myTrigger")
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(5).repeatForever())
                .build();
        
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

输出结果

Hello Quartz!
JobDetail key name: dummyJobName
JobDetail key Group: group1
JobDetial:hello myJob1
floatMsg:1.2
TriggerKey key name: dummyTriggerName
TriggerKey key Group: group1
triggerMsg:hello myJob1

相关文章
相关标签/搜索