Quartz原理解析
来源:互联网 发布:淘宝产品为什么下架了 编辑:程序博客网 时间:2024/06/14 08:20
最近项目中好多地方都需要用到定时器,一开始用的是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,可以用下面的方式实现自己的定制化:
步骤2.然后通过getScheduler()方法从调度器工厂里得到调度器实例,首先查找有没有这样的调度器,没有的话,就生成一个,有的话直接返回。所以得到的一般是单例,即默认的调度器。
步骤3.Scheduler有一个QuartzSchedulerThread(Thread的子类)属性,在scheduler实例化的时候,实例化了一个对象,并用ThreadExecutor启动该线程对象。该线程就是调度线程,主要任务就是不停的从JobStore中获取即将被触发的触发器(默认30s调度一次)。在这个时候调度线程虽然启动,但是处于pause状态。
步骤4.接下来是任务调度的部分:
client通过scheduleJob()方法将任务和触发器存储在JobStore中,通过start()方法将QuartzSchedulerThread的pause状态设为false,通知调度线程执行任务,此后调度线程不停的从JobStore中去取即将触发的任务。
2)任务执行的时序如下所示:
上半部分展现的是任务执行之前准备工作的时序,下半部分展现的是任务执行的时序。
步骤1.调度线程首先去线程池中获取可用的线程,如果没有的话,就阻塞。
步骤2.从JobStore(从存储介质中获取触发器,存储介质可以是内存也可以是数据库)获取(接下来30s内的)触发器,然后等待该触发器触发。
步骤3.调度线程创建一个JobRunShell(就是一个Runnable),然后从线程池中调用线程执行该任务。
接下来就是任务执行的时序:
步骤4.获取trigger、JobDetail以及生成Job实例,然后执行job的execute接口函数。
3)持久化的任务的执行时序如下:
以上就是Quartz的基本工作流程。
- Quartz原理解析
- Quartz源码解析 ---- 触发器按时启动原理
- Quartz集群实战及原理解析
- Quartz集群配置与原理解析
- Quartz源码解析 ---- 触发器按时启动原理
- quartz原理
- quartz原理
- quartz原理
- quartz的原理
- quartz的原理
- quartz工作原理
- Quartz 基本概念及原理
- quartz的原理实现
- Quartz 基本概念及原理
- 理解Quartz原理
- Quartz原理分析
- Spring quartz的原理
- quartz 基本概念及原理
- SpringMVC学习(五)-RESTFUl_CRUD操作
- 奇数个数
- 机器学习实战之KMeans算法pandas实现
- reshape 与 shape
- spring4+ Quartz2动态任务
- Quartz原理解析
- Okhttp3 带参数文件上传~重复造轮子中
- 配置文件解读 http://blog.csdn.net/maweifei/article/details/52965523
- sparkSQL官网简单解析
- Javaweb学习总结(三)
- 最大似然,贝叶斯,最大后验
- PEP 328
- Schedule
- 1321:棋盘问题