文档章节

Quartz原理解析

石日天
 石日天
发布于 06/25 19:04
字数 1092
阅读 4
收藏 0

Quartz原理解析

最近项目中好多地方都需要用到定时器,一开始用的是netty的hashWheel,后来发现删除任务的时候不是很好删除,于是就放弃了,然后选择了Quartz。

  • hashWheel定时器和Quartz的区别:

1)Quartz将定时任务分为任务和触发器,而hashWheel只有任务的概念

2)Quartz通过一个TreeSet对所有的触发器进行管理,而hashWheel通过一个hash轮来对所有的任务进行管理

3)Quartzl能够非常方便的删除定时任务,而netty的hashWheel暂时没有删除任务的接口(除非自己实现一个hashWheel定时器)

4)Quartz有一个专门的调度线程对任务进行管理,任务执行有另外专门的线程池,而hashWheel用一个线程实现对任务的管理和任务的执行。

5)Quartz能够通过序列化,将定时任务保存在数据库,而hashWheel不能

总的来说,Quartz的功能相对强大,而hashWheel相对要轻量级一点。

 

  • Quartz定时器原理:

接下来就讲讲Quartz的原理。

1)首先任务调度器调度的时序大致如下所示:

在这里将几个重要的类调用的过程以序列图的形式展现出来,上半部分展现的是启动过程,下半部分展现的是任务调度的过程。

步骤1.用户首先需要生成一个调度器工厂SchedulerFactory,可以用下面的方式实现自己的定制化:

1 Properties properties=new Properties();    properties.put("org.quartz.threadPool.class","org.quartz.simpl.SimpleThreadPool");
2 properties.put("org.quartz.threadPool.threadCount","10");
3 SchedulerFactory sf=new StdSchedulerFactory(properties);

步骤2.然后通过getScheduler()方法从调度器工厂里得到调度器实例,首先查找有没有这样的调度器,没有的话,就生成一个,有的话直接返回。所以得到的一般是单例,即默认的调度器。

步骤3.Scheduler有一个QuartzSchedulerThread(Thread的子类)属性,在scheduler实例化的时候,实例化了一个对象,并用ThreadExecutor启动该线程对象。该线程就是调度线程,主要任务就是不停的从JobStore中获取即将被触发的触发器(默认30s调度一次)。在这个时候调度线程虽然启动,但是处于pause状态。

步骤4.接下来是任务调度的部分:

1 Scheduler scheduler=sf.getScheduler();
2 scheduler.addJobListener(new TaskListener());
3 scheduler.scheduleJob(jobDetail, simpleTrigger);
4 scheduler.start();

client通过scheduleJob()方法将任务和触发器存储在JobStore中,通过start()方法将QuartzSchedulerThread的pause状态设为false,通知调度线程执行任务,此后调度线程不停的从JobStore中去取即将触发的任务。

 

2)任务执行的时序如下所示:

上半部分展现的是任务执行之前准备工作的时序,下半部分展现的是任务执行的时序。

步骤1.调度线程首先去线程池中获取可用的线程,如果没有的话,就阻塞。

步骤2.从JobStore(从存储介质中获取触发器,存储介质可以是内存也可以是数据库)获取(接下来30s内的)触发器,然后等待该触发器触发。

步骤3.调度线程创建一个JobRunShell(就是一个Runnable),然后从线程池中调用线程执行该任务。

接下来就是任务执行的时序:

步骤4.获取trigger、JobDetail以及生成Job实例,然后执行job的execute接口函数。

 

3)持久化的任务的执行时序如下:

 

以上就是Quartz的基本工作流程。

 

我在使用的时候遇到的一些问题:

1.Quartz与Spring的整合-Quartz中的job如何自动注入spring容器托管的对象?

这个问题网上已经有解决方法,但是按照它的步骤执行之后还是不行,后来经过尝试发现,在实现接口ApplicationContextAware的时候,需要将private ApplicationContext applicationContext;改成静态的private static ApplicationContext applicationContext,

之后这个问题就得到完美解决了。

© 著作权归作者所有

石日天
粉丝 2
博文 62
码字总数 67819
作品 0
杭州
私信 提问
基于spring+quartz的分布式任务调度

学习地址:http://www.roncoo.com/course/view/e2b459016e2e477dbd5d67c8b23fe86d 课程介绍 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相...

小红牛
2018/04/19
0
0
alexdev/LayersTimerTask

分层的定时任务系统 使用技术 使用 .net Core 开发; roncoo-adminlte 后台界面 Quartz.net 做定时; nlog日志。 原理 设定需要定时触发任务的请求地址,请求的cron,处理成功判定结果,告警...

alexdev
2016/11/16
0
0
Quartz与Spring集成—— SchedulerFactoryBean的初始化分析

前言 Quartz是一个开源的定时调度框架,支持集群部署。我们可以通过其Java API来使用它,或者通过Spring来配置与管理,也可以结合使用两种方式。本文重点分析Quartz2.2.3与Spring4.3.0.RELEA...

哲别0
2017/11/05
0
0
Spring Quartz的原理

Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便。 一、核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。 1、Job 表示一...

laigous
2014/05/05
0
1
elastic-job 源码解读之job类设计结构

 在国内目前最著名的两个开源分布式调度,一个是elastic-job,一个是xxl-job,前段时间一直在看xxl-job相关的实现原理,最近一直在研究elastic-job的实现原理,xxl-job是中心化的分布式调度...

一滴水的坚持
2017/11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux日志切割工具 logrotate

Linux系统默认安装logrotate,默认的配置文件: /etc/logrotate.conf /etc/logrotate.d/ logrotate.conf:为主配置文件 logrotate.d:为配置相关子系统,用于隔离每个应用配置(Nginx、PHP、...

llzzzz
12分钟前
0
0
不得不收藏的大数据Hadoop教程:Hadoop集群搭建

搭建环境安装时间同步Yum install -y ntpdate 网络时间同步命了 服务器地址是阿里云ntpdate ntp1.aliyun.com 手动时间同步方式date -s "20190622 12:32:00" #yyyymmdd hh:mm:ss完全分布式服务...

好程序员IT
15分钟前
0
0
xhprof php性能分析工具

php7 没有官方版 下载地址git clone https://github.com/longxinH/xhprof cd xhprof/extension/ 进入目录指定phpconfig地址进行安装 extension=xhprof.so xhprof.output_dir=/tmp 安装包中x......

曲文
16分钟前
0
0
CentOS7安装GitLab的过程详解

安装Gitlab Step 1.安准基础依赖 $ yum install -y curl policycoreutils-python openssh-server Step 2.安装Postfix 说明:Postfix是一个邮件服务器,GitLab发送邮件需要用到 $ yum ins...

Linux_Anna
17分钟前
0
0
Centos 用docker安装Confluence

1. 下载官方镜像 docker pull atlassian/confluence-server:6.15.7-alpine 2. 创建并运行容器 docker run -m 1024M --memory-swap -1 -host --net=host --name wiki -d -p 8090:8090 -p 800......

熊小熊会写代码哦
30分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部