学习笔记:Quartz初印象
2016-06-01 18:45
295 查看
Quartz概述
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行任务调度提供了简单却强大的机制。作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。具有以下特点:强大的调度功能。例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
灵活的应用方式。例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
分布式和集群能力。
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。 |
在线文档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
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树