Quartz一个job的执行过程

一、简介

我这里的分析采用的是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并运行,代码如下:

155708_v1vG_2937247.png

 

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

155701_ZJ58_2937247.png

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

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

155653_u6BL_2937247.png

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

 

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

155643_kO1D_2937247.png

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

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

155634_CvUr_2937247.png

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

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

155628_fU4b_2937247.png

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

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

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

155614_ZMKW_2937247.png

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

155607_MnAz_2937247.png

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

155511_DpwJ_2937247.png

job启动。

转载于:https://my.oschina.net/u/2937247/blog/1204468

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值