前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Quartz入门指南

Quartz入门指南

作者头像
栋先生
发布2018-09-29 16:43:06
9850
发布2018-09-29 16:43:06
举报
文章被收录于专栏:Java成长之路

什么是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为:SimpleTriggerCronTirgger

  • 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
mark

Quartz 核心元素关系图

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

mark
mark

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

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

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

Quartz的demo

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

代码语言:javascript
复制
log4j.rootLogger=DEBUG,A1
log4j.logger.com.taotao = DEBUG
log4j.logger.org.mybatis = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
  1. 通过实现 job 接口定义我们自己的任务类:
代码语言:javascript
复制
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());
    }
}

本实例中,我们利用 CronTrigger 实现一个每分钟执行一次的任务调度。

代码语言:javascript
复制
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();
    }
}

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

相关博文: Quartz之CronTrigger

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年07月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Quartz?
  • Quartz的运行原理
    • job 和 jobDetail
      • tigger
        • scheduler
          • Quartz中4个接口之间的调用关系
          • Quartz的demo
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档