Quartz入门指南

来源:互联网 发布:char转int c语言 编辑:程序博客网 时间:2024/05/18 00:39

什么是Quartz?

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。
作为一个优秀的开源调度框架,Quartz 具有以下特点:

  • 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
  • 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
  • 分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。本文暂不讨论该部分内容;

简单的来说,Quartz可以理解为是一个定时器的框架。

Quartz的运行原理

Quartz中最重要的四个接口为:scheduler(任务调度器)、tigger(触发器,用于定义任务调度时间规则)、job(任务,即被调度的任务)、jobDetail(定义Job的实例).。

job 和 jobDetail

在 Quartz 中,job 用于表示被调度的任务。在实际的应用中,需要定义了一个实现Job接口的类,这个类仅仅表明该job需要完成什么类型的任务,除此之外,Quartz还需要知道该Job实例所包含的属性;这将由JobDetail类来完成。

tigger

在 Quartz 中,trigger 是用于定义调度时间的元素,即按照什么时间规则去执行任务。trigger也有很多类型,可以根据实际需要来选择。其中最为常用的两种tigger为:SimpleTrigger 和 CronTirgger 。

  • SimpleTrigger: 简单的触发
    SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
    如果你想让触发器在2014年1月11日,上午11:23:54秒执行,然后每个隔10秒钟重复执行一次,并且这样重复5次。那么SimpleTrigger 就可以满足你的要求。

  • CronTrigger: 表达式触发
    如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。
    使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续。

scheduler

在 Quartz 中, scheduler 由 scheduler 工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二种工厂 StdSchedulerFactory 使用较多,因为 DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。 Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。本文以最常用的 StdScheduler 为例讲解。这也是LZ在项目中所使用的 scheduler 类。
mark

Quartz 核心元素关系图

Quartz中4个接口之间的调用关系

mark

Quartz中4个接口之间的调用关系

关于这四个接口更加详细的介绍可以参考以下内容:

  1. 官方英文文档
  2. 翻译后的中文文档

Quartz的demo

  1. log4j.properties 文件的配置为:
    本例子通过log4j来打印定时任务需要打印的内容。

    log4j.rootLogger=DEBUG,A1log4j.logger.com.taotao = DEBUGlog4j.logger.org.mybatis = DEBUGlog4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
  2. 通过实现 job 接口定义我们自己的任务类:

    public class HelloJob implements Job {    private static Logger _log = LoggerFactory.getLogger(HelloJob.class);    public HelloJob() {    }    public void execute(JobExecutionContext context)        throws JobExecutionException {        _log.info("Hello World! - " + new Date());    }}
  3. 然后,实现任务调度的主程序,如下所示:
    本实例中,我们利用 CronTrigger 实现一个每分钟执行一次的任务调度。

    public class SimpleCronExample {    public void run() throws Exception {        Logger log = LoggerFactory.getLogger(SimpleCronExample.class);        log.info("------- Initializing ----------------------");        // 定义调度器        SchedulerFactory sf = new StdSchedulerFactory();        Scheduler sched = sf.getScheduler();        log.info("------- Initialization Complete -----------");        // 获取当前时间的下一分钟        Date runTime = evenMinuteDate(new Date());        log.info("------- Scheduling Job  -------------------");        // 定义job        JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();        // 定义触发器,每2秒执行一次        Trigger trigger = newTrigger().withIdentity("trigger1", "group1")                .withSchedule(cronSchedule("0/5 * * * * ?")).build();        // 将job注册到调度器        sched.scheduleJob(job, trigger);        log.info(job.getKey() + " will run at: " + runTime);        // 启动调度器        sched.start();        log.info("------- Started Scheduler -----------------");        // 等待1分钟        log.info("------- Waiting 60 seconds... -------------");        try {            Thread.sleep(60L * 1000L);        } catch (Exception e) {            //        }        // 关闭调度器        log.info("------- Shutting Down ---------------------");        sched.shutdown(true);        log.info("------- Shutdown Complete -----------------");    }    public static void main(String[] args) throws Exception {        SimpleCronExample example = new SimpleCronExample();        example.run();    }}

    此时控制台将没过5秒钟输出一次:Hello World!

该demo的下载地址为:https://github.com/9527dong/demo/tree/master/quartz

相关博文:
Quartz之CronTrigger