学习笔记:Quartz初印象

原创 2016年06月01日 18:45:54

Quartz概述

  Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行任务调度提供了简单却强大的机制。作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。具有以下特点:

  1. 强大的调度功能。例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
  2. 灵活的应用方式。例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
  3. 分布式和集群能力。
    Quartz官网:http://www.quartz-scheduler.org/

Quartz基本原理

  要想理解Quartz的原理,只需要搞明白Quartz中几个核心元素即可明白,Quartz任务调度的核心元素是 scheduler, trigger和job,其中trigger和job 是任务调度的元数据,scheduler 是实际执行调度的控制器。其关系如下图:
这里写图片描述  

  • Job:是一个接口,此接口只有一个方法,void exceute(JobExecutionContext context) ,开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中;
  • JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类描述Job的实现类及其相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色;
  • Trigger:触发器,描述触发Job执行的时间触发规则。主要有SimpleTrigger 、CronTrigger及NthIncludeDayTrigger三种触发器,当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择。而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案,如每天中午12执行等;
  • Calendar:org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合。一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点;
  • Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler可以将Trigger绑定到某一JobDetail中,这样当 Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler主要有三种:RemoteMBeanScheduler,RemoteScheduler和StdScheduler。Scheduler拥有一个SchedulerContext,它类似ServeletContext,保存着Scheduler上下文信息,注册到该Scheduler的Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据;
  • Listener:Quartz提供了listener功能。主要包括三种listener:JobListener,TriggerListener及SchedulerListener。可对Job,Trigger及Scheduler内部行为进行监听;
  • ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。

Quartz源码模块(Quartz2.1.7)

这里写图片描述

模块 功能
quartz-all-<ver>.jar 所有的Quartz库,包含了所有Quartz所有代码库,如果使用了这个library,就无需其他的quartz-*.jar了。
quartz-<ver>.jar Quartz核心代码库
org.quartz 主package,主要包含一些用于任务调度的“public”的API。
org.quartz.core 这些package主要是一些“private”的quartz组件。
org.quartz.simpl 这些package包含一些实现类(如:JobStores, ThreadPools, Loggers等),这些实现类不依赖于任何第三方jar。
org.quartz.impl 这些package主要包含一些可能依赖第三方的实现类。
org.quartz.utils 主要是一些util类。
quartz-jboss-<ver>.jar 操作JBoss的Quartz扩展,例如:QuartzServiceMBean,QuartzService。
quartz-terracotta-<ver>.jar 操作Terracotta的Quartz扩展,保证基于Terracotta集群的Job store(详情:http://www.terracotta.org/dl/oss-download-catalog)。
quartz-weblogic-<ver>.jar 操作weblogic的Quartz扩展,例如:WebLogicDelegate。
docs/dbTables 基于不同数据库的sql脚本。
examples 有关Quartz的example。

  Quartz(Quartz2.1.7)所依赖的第三方包包括(注:如果在官网下载Quartz则可以直接在lib文件中取所依赖的第三方包):
这里写图片描述

在线文档API文档:http://www.quartz-scheduler.org/api/2.1.7/index.html

Quartz入门示例

1、 通过实现Job接口定义我们自己的任务,如下:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HaiwiJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println(context.getFireTime() + "执行一次!接受key1参数:"
                    + context.getJobDetail().getJobDataMap().getString("key1"));
    }
}

2、 使用CronScheduleBuilder实现的Cron表达式实现每两秒的间隔执行一次任务。

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 HaiwiTest {
    public void runJob() throws Exception{
        //实例化JobDetail,用于封装自定义的Job
        JobDetail jobDetail = JobBuilder.newJob().ofType(HaiwiJob.class).withIdentity("haiwiJob").build();
        //JobDataMap主要用于传参
        jobDetail.getJobDataMap().put("key1","val1");
        //实例化触发器,每2秒触发一次Trigger
        Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).startNow().build();
        //实例化Scheduler工厂,并获得一个Scheduler
        Scheduler scheduler = (new StdSchedulerFactory()).getScheduler();
        scheduler.scheduleJob(jobDetail,trigger);
        //启动任务调度
        scheduler.start();
    }

    public static void main(String[] args) throws Exception{
        try {
            HaiwiTest haiwiTest = new HaiwiTest();
            haiwiTest.runJob();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

其中Cron表达式的生成可以直接在线生成:
http://cron.qqe2.com/

参考链接:
https://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/
http://liangjf85-163-com.iteye.com/blog/2017457

Quartz学习笔记1:Quartz概述

Quartz是开源任务调度框架中的翘楚,它提供了强大的 任务调度机制。Quartz允许开发人员灵活的定义触发器的调度时间表,并可对触发器和任务进行关联映射。此外,Quartz提供了调度运行环境的持久化...
  • yulei_qq
  • yulei_qq
  • 2016年09月04日 11:42
  • 794

Quartz学习笔记-Spring整合与简单使用

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz 允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与...
  • wulinshishen
  • wulinshishen
  • 2015年02月16日 10:59
  • 1105

《Linux Shell编程 从初学到精通》 学习笔记

第一章 shell脚本编程概述 1.linux的流行是因为它的高可定制性。由于内核仅有几兆的代码量,我们可以根据需要抽离很多用不到的模块。比如设计一个简陋的计算器,就完全不需要网络模块。 2.L...
  • qq_28926493
  • qq_28926493
  • 2016年05月25日 21:58
  • 3194

quartz学习笔记 初略写法

慕课网学习的quartz这个强大的定时任务工具  地址:http://www.imooc.com/search/?words=quartz  quartz框架可以实现任务调度 在项目和网站上都是用很多...
  • qq_38849239
  • qq_38849239
  • 2017年08月16日 21:42
  • 19

Hinton Neural Networks课程笔记2b:第一代神经网络之感知机

感知机可以说是最简单最经典的神经网络模型了,简单而言就是对输入加权求和之后,得到一个评价值和一个threshold比较,从而进行分类。只能求取线性分类面,极大依赖于特征提取,但速度极快,适用于特征维度...
  • silent56_th
  • silent56_th
  • 2017年08月10日 16:09
  • 343

CentOS 7初印象

我呢,大四了!快毕业了,啥也不会,感觉前途渺茫,考研又耽误一年时间,原本会的也不怎么会了。正所谓临阵磨枪,不快也光吗。所以我从头决定学习一下Linux。 早就想写自己的技术博客,可是自己是个小白也就只...
  • Aspen_Han
  • Aspen_Han
  • 2015年01月13日 15:43
  • 199

01hibernate初印象

一、hibernate概述
  • u013953289
  • u013953289
  • 2014年06月17日 21:53
  • 252

Ruby-初印象

跟很多编程语言相比,Ruby是一名新秀了,加上Ruby生于日本,所以即使语言本身并无东亚文字的印记,但是资料还是相对较少。在接触Ruby的过程中,我感觉这门语言里拥有和许多脚本语言的印迹,觉得蛮有意思...
  • mashroomxl
  • mashroomxl
  • 2014年12月13日 00:07
  • 485

PHP框架初印象

最近几天都在浏览关于PHP框架的信息,不过从百度搜索出来的信息比较多,设计的框架类型也很多,对于暂时还未深入使用框架的我来说,还没有很深的体会。不过我一直在思考为什么要用框架。当我们开始学习一门语言,...
  • HorseRunningNoStop
  • HorseRunningNoStop
  • 2016年11月12日 21:47
  • 341

lua初印象

经常被几个问题困扰着: 1. 究竟开发一个交易软件用什么软件最好? c++, java, c#, Python 经常得到的一般答案是C++适合用来性能好(低延迟)的交易软件,c#适合用来做wind...
  • bruce_dls
  • bruce_dls
  • 2017年11月14日 11:05
  • 51
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习笔记:Quartz初印象
举报原因:
原因补充:

(最多只允许输入30个字)