Quartz是一个开源的任务调度框架,它有别于Timer,有比Timer更好的性能。由于故障切换以及负载均衡能力使得Quartz框架具有如下特点:

1.强大的调度功能。

2.灵活的应用方式。

3.分布式和集群能力。

以上三个特点使得Quartz在多任务调度以及分布式中具有很大的作用,以下通过Quart框架中几个重要的组件来了解Quartz框架是如何工作的。关于Quartz框架,我们需要了解的几个组件的概念是:Job组件系列、Trigger组件系列以及Scheduler系列。本文主要讲述的是Job组件系列。

首先Job是一个接口,如下代码所示,该接口只有一个方法,因此Job实现类只需要实现execute方法即可。

public interface Job {/** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* * Interface.* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*//*** <p>* Called by the <code>{@link Scheduler}</code> when a <code>{@link Trigger}</code>* fires that is associated with the <code>Job</code>.* </p>* * <p>* The implementation may wish to set a * {@link JobExecutionContext#setResult(Object) result} object on the * {@link JobExecutionContext} before this method exits.  The result itself* is meaningless to Quartz, but may be informative to * <code>{@link JobListener}s</code> or * <code>{@link TriggerListener}s</code> that are watching the job's * execution.* </p>* * @throws JobExecutionException*           if there is an exception while executing the job.*/void execute(JobExecutionContext context)throws JobExecutionException;}

创建Job实现类之后,需要将Job实例绑定到JobDetail对象中,其中JobDetail中是一个接口,并继承了Serializable和Cloneable接口。

public interface JobDetail extends Serializable, Cloneable 

创建JobDetail实例需要调用JobBuilder类中的静态方法newJob方法,该方法封装了创建JobBuilder对象的过程。

 public static JobBuilder newJob() {return new JobBuilder();}/*** Create a JobBuilder with which to define a <code>JobDetail</code>,* and set the class name of the <code>Job</code> to be executed.* * @return a new JobBuilder*/public static JobBuilder newJob(Class <? extends Job> jobClass) {JobBuilder b = new JobBuilder();b.ofType(jobClass);return b;}

创建JobBuilder对象之后需要绑定Job实现类,通过调用实例方法withIdentity方法来进行绑定的,其中参数group可以缺省。可以看到该方法中通过创建一个JobKey对象,并返回JobBuilder对象,从而实现绑定的。

public JobBuilder withIdentity(String name) {key = new JobKey(name, null);return this;}  /*** Use a <code>JobKey</code> with the given name and group to* identify the JobDetail.* * <p>If none of the 'withIdentity' methods are set on the JobBuilder,* then a random, unique JobKey will be generated.</p>* * @param name the name element for the Job's JobKey* @param group the group element for the Job's JobKey* @return the updated JobBuilder* @see JobKey* @see JobDetail#getKey()*/public JobBuilder withIdentity(String name, String group) {key = new JobKey(name, group);return this;}/*** Use a <code>JobKey</code> to identify the JobDetail.* * <p>If none of the 'withIdentity' methods are set on the JobBuilder,* then a random, unique JobKey will be generated.</p>* * @param jobKey the Job's JobKey* @return the updated JobBuilder* @see JobKey* @see JobDetail#getKey()*/public JobBuilder withIdentity(JobKey jobKey) {this.key = jobKey;return this;}

再来看看JobKey的源码,它继承了Key<T>一个泛型类,并且有两个构造函数:

public JobKey(String name) {super(name, null);}public JobKey(String name, String group) {super(name, group);}

可以看出这两个构造函数都继承了父类构造函数,接下来看看Key的源码,这也解释了前面withIdentity方法的group参数为何可以缺省,因为它一旦缺省就会默认为DEFAULT_GROUP。

public Key(String name, String group) {if(name == null)throw new IllegalArgumentException("Name cannot be null.");this.name = name;if(group != null)this.group = group;elsethis.group = DEFAULT_GROUP;}

最后回到JobBuilder创建JobDetail对象的最核心的方法build方法:

public JobDetail build() {JobDetailImpl job = new JobDetailImpl();job.setJobClass(jobClass);job.setDescription(description);if(key == null)key = new JobKey(Key.createUniqueName(null), null);job.setKey(key); job.setDurability(durability);job.setRequestsRecovery(shouldRecover);if(!jobDataMap.isEmpty())job.setJobDataMap(jobDataMap);return job;}

从上面build方法可以看出,内部创建了一个JobDetail实现类对象,并且将一些相关的信息保存到该对象中并返回。从而实现JobDetail的创建。

从上面整个过程来说,首先实现Job接口创建实现类。然后需要创建JobDetail对象,该对象的创建比较复杂,首先调用JobBuilder类的类方法newJob创建对象,并且调用实例方法withIdentity方法该方法是通过内部创建一个JobKey实例,将Job实现类的实例对象绑定其中,最后调用build方法则是为了创建JobDetail实现类的对象,并为对象初始化一些信息。

以上就是Job组件系列的关系以及工作流程。

初识Quartz之Job组件相关推荐

  1. 初识Quartz之Trigger组件

    前文已经介绍了Job组件,本文介绍Trigger组件,其实Trigger组件关系网与Job组件关系网类似. 1.trigger接口 首先Trigger是个接口,继承了Serializable.Clon ...

  2. 初识Quartz (一)

    首先大概的了解一下Quartz. 一:首先进入官网去看看什么是quartz.http://www.quartz-scheduler.org/ Quartz是一个功能丰富的开源作业调度库,可以集成到几乎 ...

  3. 初识Quartz(三)

    为什么80%的码农都做不了架构师?>>>    简单作业: package quartz_project.example3;import java.util.Date;import ...

  4. 初识react中高阶组件

    高阶组件并不是一个组件,而是一个函数 这个函数返回值是一个组件,并且接受一个组件做为参数:并且返回一个新组件: function HighOC(WrapComponent){ //定义一个高阶组件 , ...

  5. 【微信小程序】初识微信小程序组件

    作者简介:一名C站萌新,前来进行小程序的前进之路博主主页:大熊李子

  6. 一文揭秘定时任务调度框架quartz

    之前写过quartz或者引用过quartz的一些文章,有很多人给我发消息问quartz的相关问题, quartz 报错:java.lang.classNotFoundException quartz源 ...

  7. 项目中使用Quartz集群分享--转载

    原文:http://hot66hot.iteye.com/blog/1726143 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享  一:CRM对定时任务的依赖 ...

  8. Quartz-Spring集成Quartz通过XML配置的方式

    文章目录 概述 Maven依赖 步骤 1 创建JobDteail 2 创建Trigger 3 创建Scheduler 示例-MethodInvokingJobDetailFactoryBean 示例- ...

  9. Quartz.NET快速入门指南

    最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西.确实是好东西,既然是好东西,我就拿出来分享一下.万丈高楼平地起,我们也从入门开始 ...

最新文章

  1. 利用vue-resource模拟百度下拉列表
  2. java 保留数字与中文_java 转中文数字
  3. Deploying Keras model on Tensorflow Serving
  4. 如果访问云服务器上的文件,如果访问云服务器上的文件
  5. perl学习之:函数总结
  6. 17 MM配置-BP业务伙伴-定义业务伙伴角色
  7. boost——windows下VS2013update5编译boost库
  8. 20190226work
  9. 计算机技术在档案管理中的应用,浅谈计算机技术在档案管理中的应用
  10. JS判断手机浏览器(转)
  11. 六下计算机教学总结,六年级信息技术教师教学工作总结
  12. 一起谈.NET技术,ASP.NET的状态管理
  13. 【编程软件】keli烧录代码点击Download或者Debug界面卡死
  14. Linux下如何解压.zip和.rar文件
  15. igs无法分配驱动器映射表_明白步进驱动器原理,就知道为什么步进电机要加驱动器了...
  16. [Docker入门-2] Docker Containers 的创建和使用
  17. 利用图神经网络进行的知识图谱补全综述
  18. 硬件电路常用设计摘要
  19. android su文件,Android su开放root权限
  20. linux下测试远程端口

热门文章

  1. 春考计算机应用本科哪所大学好,山东春考2021可以考哪些本科学校
  2. 4月,不要跳槽...
  3. linux下mq qm.ini路径,MQ调优Linux参数检查
  4. mysql 南邮ctf_南京邮电大学CTF密码学之MD5-golang与php代码实现
  5. excel 导出 php和go 版本
  6. 2018 年技术趋势预测
  7. JS——使用VConsole
  8. Keil软件常见配置
  9. SK hynix announces 96GB DDR5 CXL 2.0 memory expansion solution【搬运外媒VedioCardz报道(手工翻译)】
  10. ECL/PECL/LVPECL电平学习笔记