文档章节

Quartz一个job的执行过程

峥嵘岁月
 峥嵘岁月
发布于 2017/07/07 15:56
字数 544
阅读 29
收藏 0

一、简介

我这里的分析采用的是quartz-2.2.1的简单配置。

1.       用的线程池是quartz自带的org.quartz.simpl.SimpleThreadPool;

2.       采用org.quartz.impl.StdSchedulerFactory.getScheduler()来获取Scheduler;

3.       Job的存储方案采用org.quartz.simpl.RAMJobStore;

4.       采用org.quartz.impl.StdJobRunShellFactory. createJobRunShell()来得到JobRunShell;

5.       主线程org.quartz.core.QuartzSchedulerThread在初始化时被创建出来,一直等到关闭应用时才会停止;

6.       采用org.quartz.core.JobRunShell运行Job;

7.       采用工具类org.quartz.core.QuartzSchedulerResources来存储执行过程中需要的对象,包括线程池(threadPool)、Job的存储对象(jobStore)、获取Job运行的工厂(jobRunShellFactory)等;

 

 

二、Job具体运行流程分析

1. org.quartz.core.QuartzScheduler.QuartzScheduler(QuartzSchedulerResources, long, long)在初始化时会生成主线程QuartzSchedulerThread并运行,代码如下:

 

2. org.quartz.core.QuartzSchedulerThread.run():主线程(Job的启动者)中是一个相当于是一个死循环,代码如下:

只有当定时任务应用关闭时调用org.quartz.core.QuartzScheduler.shutdown(boolean)才会停止,

org.quartz.core.QuartzSchedulerThread.halt(boolean);代码如下:

(上述代码中join()方法的调用时让子线程执行完毕之后再往下执行,该句代码的意义是等待所有的定时任务结束在停止应用程序)。

 

3.经过上面的分析我们知道了,Job的启动的由来,下面我们具体分析一个job的运行过程。org.quartz.core.QuartzSchedulerThread.run()中,

该代码片段表示只有当paused=false时才会往下执行,而要让paused=false只有等到togglePause(false)被调用唤起,而Scheduler.start()会调用togglePause()调用。

org.quartz.core.QuartzSchedulerThread.run():

初始化JobRunShell,然后采用线程池运行JobRunShell。多线程部分的控制代码如下:

org.quartz.simpl.SimpleThreadPool.runInThread(Runnable):

(1)       等待可用线程不为空再往下执行;

(2)       从可用线程集合中取出一个线程并从中移除,并将该线程加入到忙碌线程集合中

(3)       调用org.quartz.simpl.SimpleThreadPool.WorkerThread.run(Runnable)方法:

这里开启一个JobRunShell,用runnabel这个变量进行控制。如果runnable不为空,说明该线程正在运行。如果为空往下执行将runnable赋值。赋值完之后,org.quartz.simpl.SimpleThreadPool.WorkerThread.run()监听到,程序往下执行,代码如下:

如果runnable为空,则一直轮询,等到runnbale不为空,程序往下执行调用org.quartz.core.JobRunShell.run()。

job启动。

© 著作权归作者所有

上一篇: linux相关
峥嵘岁月
粉丝 0
博文 15
码字总数 3168
作品 0
深圳
私信 提问
【转】Quartz教程七--TriggerListener和JobListener

listener是一个对象,用于监听scheduler中发生的事件,然后执行相应的操作;你可能已经猜到了,TriggerListeners接受与trigger相关的事件,JobListeners接受与jobs相关的事件。 trigger相关的...

900
2016/01/29
80
0
SpringBoot之定时任务quartz

前言:对于Quartz(kwɔrts)之前在公司用过,比较尴尬的是真的只是用过,写个控制器在任务系统里配置一下cron表达式就完事 https://github.com/songwie/task。从那天起我就对Quartz失去了兴趣...

王念博客
2016/10/13
1K
2
elastic-job 源码解读之job的启动过程

 开始分析elasticJob的启动过程,首先看官方example的启动实例:  从官方的Example代码中看,三种不同类型的作业完成基本的参数组装之后,都是交给JobScheduler这个对象的init()方法去统一...

一滴水的坚持
2017/11/14
0
0
quartz (从原理到应用)详解篇

目录: 一、Quartz 基本介绍 1.1 Quartz 概述 1.2 Quartz特点 1.3 Quartz 集群配置 二、Quartz 原理及流程 2.1 quartz基本原理 2.2 quartz启动流程 三、Spring + Quartz 实现企业级调度的实现...

为梦而来
2016/12/08
1K
7
quartz集群

其实主要还是借鉴别人的东东,写的还挺好的。我自己只在最后说说自己遇到的坑吧。 1、Quartz任务调度的基本实现原理   Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基...

梦蝶飘雪
2016/08/12
188
0

没有更多内容

加载失败,请刷新页面

加载更多

在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
1
0
高德API入门教程

项目需求 1、实现打开地图就能定位到中心显示标注点 2、点击标注显示保利可爱岛的详细信息 3、实现导航功能 <!doctype html><html><head> <meta charset="utf-8"> <meta http-......

我叫小糖主
昨天
7
0
聊聊Elasticsearch的MonitorService

序 本文主要研究一下Elasticsearch的MonitorService MonitorService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/MonitorService.java public class MonitorServic......

go4it
昨天
3
0
二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
昨天
3
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部