Quartz_理解3
- 什么是Quartz
- Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作.
- Quartz能干什么/应用场景
- 如网页游戏中挂机自动修炼如8个小时,人物相关数值进行成长,当使用某道具后,时间减少到4个小时,人物对应获得成长值.这其中就涉及到了Scheduler的操作,定时对人物进行更新属性操作,更改定时任务执行时间.
- 网页游戏中会大量涉及到Scheduler的操作,有兴趣的朋友可自行联想.
- 企业中如每天凌晨2点触发数据同步、发送Email等操作
- 同类框架对比
- TimeTask TimeTask在Quartz前还是显得过于简单、不完善,不能直接满足开发者的较为复杂的应用场景.
- 资源
- 官网:http://www.quartz-scheduler.org/
- 下载:http://www.quartz-scheduler.org/downloads
- maven pom
- <dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
- <dependency>
- 源代码 svn:http://svn.terracotta.org/svn/quartz
- 本文章采用的是2.21版本:CSDN下载:http://download.csdn.net/detail/chenweitang123/7636703
- 例子Demo:CSDN下载:整理完后上传.
- 框架分析
- 接口
- 类图
- Quartz中的设计模式
- Builder模式
- 所有关键组件都有Builder模式来构建 <Builder> 如:JobBuilder、TriggerBuilder
- Factory模式
- 最终由Scheduler的来进行组合各种组件 <Factory> 如SchedulerFactory
- Quartz项目中大量使用组件模式,插件式设计,可插拔,耦合性低,易扩展,开发者可自行定义自己的Job、Trigger等组件
- 链式写法,Quartz中大量使用链式写法,与jQuery的写法有几分相似,实现也比较简单,如:
- $(this).addClass("divCurrColor").next(".divContent").css("display","block");
- newTrigger().withIdentity( "trigger3", "group1").startAt( startTime).withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
- Builder模式
- 框架核心分析
- SchedulerFactory -- 调度程序工厂
- StdSchedulerFactory -- Quartz默认的SchedulerFactory
- DirectSchedulerFactory -- DirectSchedulerFactory是对SchedulerFactory的直接实现,通过它可以直接构建Scheduler、threadpool 等
- ThreadExecutor / DefaultThreadExecutor -- 内部线程操作对象
- JobExecutionContext -- JOB上下文,保存着Trigger、 JobDeaitl 等信息,JOB的execute方法传递的参数就是对象的实例
- JobExecutionContextImpl
- Scheduler -- 调度器
- StdScheduler -- Quartz默认的Scheduler
- RemoteScheduler -- 带有RMI功能的Scheduler
- JOB --任务对象
- JobDetail -- 他是实现轮询的一个的回调类,可将参数封装成JobDataMap对象,Quartz将任务的作业状态保存在JobDetail中.
- JobDataMap -- JobDataMap用来报错由JobDetail传递过来的任务实例对象
- Trigger
- SimpleTrigger <普通的Trigger> -- SimpleScheduleBuilder
- CronTrigger <带Cron Like 表达式的Trigger> -- CronScheduleBuilder
- CalendarIntervalTrigger <带日期触发的Trigger> -- CalendarIntervalScheduleBuilder
- DailyTimeIntervalTrigger <按天触发的Trigger> -- DailyTimeIntervalScheduleBuilder
- ThreadPool -- 为Quartz运行任务时提供了一些线程
- SimpleThreadPool --一个Quartz默认实现的简单线程池,它足够健壮,能够应对大部分常用场景
- -----以上是Quartz涉及到的一些关键对象,详细的内容如有机会会在后续的文章中展开!
- SchedulerFactory -- 调度程序工厂
- Quartz类图
- 类图中主要分为5块:Factory、Bulider、Scheduler、Trigger、JOB
- 思想
// 1、工厂模式 构建Scheduler的Factory,其中STD为Quartz默认的Factory
// 开发者亦可自行实现自己的Factory;Job、Trigger等组件
SchedulerFactory sf = new StdSchedulerFactory(); // 2、通过SchedulerFactory构建Scheduler对象
Scheduler sched = sf.getScheduler(); // 3、org.quartz.DateBuilder.evenMinuteDate -- 通过DateBuilder构建Date
Date runTime = evenMinuteDate( new Date()); // 4、org.quartz.JobBuilder.newJob <下一分钟> --通过JobBuilder构建Job
JobDetail job = newJob(HelloJob.class).withIdentity("job1","group1").build(); // 5、通过TriggerBuilder进行构建Trigger
Trigger trigger = newTrigger().withIdentity("trigger1","group1")
.startAt(runTime).build(); // 6、工厂模式,组装各个组件<JOB,Trigger>
sched.scheduleJob (job, trigger); // 7、start
sched.start(); try {
Thread.sleep(65L * 1000L);
} catch (Exception e) {
} // 8、通过Scheduler销毁内置的Trigger和Job
sched.shutdown(true);
10.一句话看懂Quartz
Quartz_理解3的更多相关文章
- Quartz_理解1
一.引言 quratz是目前最为成熟,使用最广泛的java任务调度框架,功能强大配置灵活.在企业应用中占重要地位.quratz在集群环境中的使用方式是每个企业级系统都要考虑的问题.早在2006年,在I ...
- Quartz_理解2
一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job 表示一个工作,要执行的具体内容.此接口中只有一个方法 void exec ...
- 理解CSS视觉格式化
前面的话 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- ThreadLocal简单理解
在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...
随机推荐
- jquery中:input和input的区别分析
:input表示选择表单中的input,select,textarea,button元素,input仅仅选择input元素. <html> <head> <style&g ...
- PHP 安装 redis、memcached、openssl、pdo_mysql等
PHP openssl 扩展的安装 这些插件可以通过在 php.ini 中添加 extension 的方式来加载所需要的插件,其实在 php 的安装包里就已经有相关的插件代码包了,在 php7 ...
- mysql面试
第一方面:30种mysql优化sql语句查询的方法 避免全表扫描: 1.where 及 order by 上建立索引.2.避免在 where 子句中使用!=或<>操作符3. select ...
- HDU 4169 UVALive 5741 Wealthy Family
树形背包.DP递推的思路很简单.... 但是由于节点有15万个,先不论空间复杂度,这样开dp数组 dp[150000+10][300+10],如果初始化是memset(dp,-1,sizeof dp) ...
- IOS之富文本编辑
之前做项目时遇到一个问题: 使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ...
- iOS开发笔记 - 界面调试神器Reveal
http://blog.csdn.net/jackfrued/article/details/50934092 Reveal是iOS开发工具中的神器之一,它能够在应用程序运行过程中调试应用程序 ...
- 《Web接口开发与自动化测试 -- 基于Python语言》 ---前言
前 言 本书的原型是我整理一份Django学习文档,从事软件测试工作的这六.七年来,一直有整理学习资料的习惯,这种学习理解再输出的方式对我非常受用,博客和文档是我主要的输出形式,这些输出同时也帮 ...
- Git提交过程的一些问题
参考:http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html 提交冲突,无法提交到github git pull origin ...
- 安装pybloomfiltermmap 遇到bug
pybloomfiltermmap pip 安装 : sudo pip install pybloomfiltermmap I want to try one program which have m ...
- CSS文字大小单位PX、EM、PT
老是被人问到px.pt和em的区别,自己有时候也会纠结到底该用什么单位,今天特意查了一些文章,下面这篇虽然很久远了,但解释的比较全面,转载收藏之.点击查看原文 这里引用的是Jorux的"95 ...