关于Quartz那点事(一)

一、文章的由来

近来,由于公司运营的系统比较多,而且都是用集群做的负载均衡,从而产生了一些问题需要解决。我们知道,集群环境下,我们写的程序会被部署到集群的每个点上去运行。这种情况下,我们的后台定时任务将会被每个点都执行一遍。如果是全局性质的任务,则会产生逻辑上的错误。一般情况下,全局任务,同一时间只能有一个实例在执行。局部任务可以每个点都(并行调度)运行。

我所要解决的,就是全局任务的调度问题。并且,研发的任务调度系统也要支持集群技术,在任务量扩大的情况下,可以有较强的伸缩性和可靠性。

根据以往经验,发现Quartz本身也支持简单的集群部署能力,于是,对Quartz本身,进行了一次学习过程,将学习成果记录下来,大家有机会共同讨论讨论。

第一章,主要讲述Quartz 的五大组件:JobDetail、Trigger、Scheduler、Listener和Plugin。前三个是任务调度方面的开发接口、后两个可以用于功能增强。

这篇文章主要针对于初学者或没接触过Quartz 的同学。

二、 Quartz 五大组件的介绍

2.1  JobDetail (任务详情)

按照字面意思JobDetail是记录任务的相关信息的一个类(他不是接口),它内部包含了任务的描述信息、任务数据、上一次的执行时间、程序层面的入口类等信息。

任务数据,以Map<String,String>的形式在程序中展现(程序中称为JobDataMap);程序层面的入口类是一个继承了Job接口的实现类,必须含有无参构造器。

Quartz 通过反射加载Job接口的实现类,并且调用无参构造器进行实例化。我们程序员创建的任务,只需要实现Job接口即可,就如同创建线程就要实现Runnable接口一样。

Quartz 的Job,以前版本还有个Statefull 的概念,新版本中取消了,就是说 Job 可不可以叠加运行。比如,执行周期是1秒而执行时间是3秒的任务,可能会被调度器叠加执行。 新版本中,在实现类上加注解@DisallowConcurrentExecution可避免叠加调用。(添加@PersistJobDataAfterExecution 注解可以在任务执行后保存JobDataMap的数据)

2.2  Trigger(触发器)

Quartz 把一个任务拆分成Trigger和Job两个部分,Trigger 是任务执行的时间点(时间点的集合),Job 是任务执行的代码(而Job的实现类保存在JobDetail中)。

Trigger 本身是一个接口类,它有 SimpleTrigger、CronTrigger 和 CalendarTrigger 等几种实现形式。

A、SimpleTrigger 它可以设定一个周期(比如一秒钟)循环往复的进行任务的触发操作,当然,可以设置触发次数(达到后停止触发),开始触发的时间和终止触发的时间。

B、CrongTrigger 它通过设定Cron表达式来确定触发的时间,这是我们最常用的触发器,它的表达式与Linux的Crontab表达式语法基本是一样的。

C、CalandarTrigger 它是一系列时间点的集合,我们并不常用这种触发器,但是,它是最全能的,它可以排除一些法定节假日不进行触发。

最后,我们要注意的是,一个任务可以由多个触发器进行触发,但是,一个触发器不能触发多个任务,只能触发一个任务。

2.3 Scheduler(调度器)

按照字面意思,它是任务和触发器的管理者,是暴露给程序员的开发接口。我们可以通过调度器提交任务和触发器的关系,到了时间点,对应的任务将被执行。当然,我们也可以通过调度器暂停或删除任务(包括触发器)。

调度器不是单例的,在一个程序里,我们可以创建多个调度器(一般不创建多个),来分类管理不同种类的任务。

由于调度器的功能比较富集,所以,它的背后包含有一个ThreadPool和一个JobStore (其他从略)。

A、ThreadPool 是执行任务的线程池,控制线程资源的伸缩性。

B、JobStore 是存放任务及其相关信息的数据结构。通过选择不同的实现类,我们可以选择存放在内存(RAMJobStore)或者 数据库(JobStoreTX或JobStoreCMT)中。

2.4 Listener(监听器)

Quartz 的监听器用于监听触发器和任务的执行状态,共有JobListener和TriggerListener两种,并且,都是全局的。

如果你的程序,需要上述的监听功能,可以灵活编写代码,增强Quartz的功能。

2.5 Plugin(插件)

插件是Quartz 提供给开发人员对其功能扩展的一个编程接口,它是一个接口类。我们如果要对Quartz 进行功能增强,可以考虑写一个插件的实现类。Quartz 启动的时候会同时加载配置好的插件,并初始化插件。

通常情况下,我们会在插件的初始化过程中,添加一些监听器,通过监听器来增强Quartz 的功能,而不是通过强制类型转换到具体的实现类来访问内部数据。

三、 总结

上面就是根据我所理解的 Quartz 的五大组件, 开发人员只要了解了这五大组件的前三种,基本上就可以着手进行Quartz 的开发和使用了,后两种属于Quartz 的功能增强接口。

后面打算针对一些具体的问题展开进行论述,如果有这方面的开发经验的同学,可以共同讨论一下。

时间: 2024-11-03 01:15:16

关于Quartz那点事(一)的相关文章

spring定时器总结

public class BusinessReport { public void perform(){ //执行报表统计入口函数 //业务逻辑 } } - 第一步,在Spring配置文件中增加本业务类 - <bean id=" businessReport " class=" BusinessReport "/> - 第二步,定义任务.在Spring配置文件中配置代理类MethodInvokingJobDetailFactoryBean,定义任务的详细

SpringBoot几种定时任务的实现方式

原文地址:SpringBoot几种定时任务的实现方式 定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少. ScheduledExecutorService:也jdk自带的一个类:是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响. Spring Tas

Quartz.net开源作业调度

Quartz.net开源作业调度框架使用详解 前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计

Quartz之Job与JobDetail浅析

Quartz可以用来做什么? Quartz是一个任务调度框架.比如你遇到这样的问题 想每月25号,信用卡自动还款 想每年4月1日自己给当年暗恋女神发一封匿名贺卡 想每隔1小时,备份一下自己的爱情动作片 学习笔记到云盘 这些问题总结起来就是:在某一个有规律的时间点干某件事.并且时间的触发的条件可以非常复杂(比如每月最后一个工作日的17:50),复杂到需要一个专门的框架来干这个事. Quartz就是来干这样的事,你给它一个触发条件的定义,它负责到了时间点,触发相应的Job起来干活. 废话不多说,代码

Quartz中时间表达式的设置-----corn表达式 (转)(http://www.cnblogs.com/GarfieldTom/p/3746290.html)

Quartz中时间表达式的设置-----corn表达式 (注:这是让我看比较明白的一个博文,但是抱歉,没有找到原作者,如有侵犯,请告知) 时间格式: <!-- s m h d m w(?) y(?) -->,   分别对应: 秒>分>小时>日>月>周>年, 举例: 1.每天什么时候执行: <value>0 59 23 * * ?</value>: 如下为每天23:59:00开始执行 <value>0 1,2,3 11,12

quartz的配置

Quartz.Net中的概念:计划者(IScheduler).工作(IJob).触发器(Trigger).给计划者一个工作,让他在Trigger(什么条件下做这件事)触发的条件下执行这个工作 将要定时执行的任务的代码写到实现IJob接口的Execute方法中即可,时间到来的时候Execute方法会被调用. CrondTrigger是通过Crond表达式设置的触发器,还有 SimpleTrigger等简单的触发器.可以通过TriggerUtils的MakeDailyTrigger.MakeHour

QUARTZ.NET 一个定时任务框架

<1> Quartz.NET-1.0.3文件下载地址 (这是老版本了,现在已经有新版本了.用法好像不一样了) 首先要添加Quartz.NET-1.0.3 文件下面的  bin/3.5/Release/Quartz/ 目录下面的Common.Logging.dll文件和Quartz.dll文件 然后添加引用.将连个文件引入到项目中来 using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; u

Quartz中时间表达式的设置-----corn表达式

时间格式: <!-- s m h d m w(?) y(?) -->,   分别相应: 秒>分>小时>日>月>周>年, 举例: 1.每天什么时候运行: <value>0 59 23 * * ?</value>: 例如以下为每天23:59:00開始运行 <value>0 1,2,3 11,12 * * ? </value>: 每天11:01,11:02,11:03; 12:01,12:02,12:03分运行任务

Quartz.NET教程:(01) 使用Quartz

使用调度器 (scheduler) 之前要先用 ISchedulerFactory 的一个实现来实例化调度器(scheduler).一旦调度器实例化完成,则它可以被启动.置于备用模式或者关闭.需要注意的是一旦调度器被关闭,只有重新实例化后才能重新启动它.调度器启动前或者触发器处于暂停状态时,触发器都不会被触发(即任务不会执行). 下列代码片段演示了实例化并启动一个调度器,并且安排了一个任务以便执行: 使用 Quartz.NET // construct a scheduler factory I