当前位置:首页 > java知识学习_java技术文章 > 正文

schedulerfactorybean执行顺序初始化剖析与配置

浏览298+

一、Quartz与spring框架整合schedulerfactorybean初始化分析

Quartz是Java程序员做定时任务时经常使用的一个开源的非常方便的定时任务框架,该框架通常与spring整合使用也可以引入其jar包自行在web项目中使用。

schedulerfactorybean是Quartz框架最重要的一环,它主导着定时任务的初始化与执行顺序,本篇文章就是讲解在spring框架中schedulerfactorybean是如何进行初始化和执行流程顺序是怎样的。

1)schedulerfactorybean在spring配置文件中的配置与入口

spring配置文件中引入schedulerfactorybean

上图是在spring的bean.xml配置文件中配置的schedulerfactorybean配置信息,由图中可见该类是spring与Quartz整合时最重要的一个初始化类,该类中需要一个数据源和一个properties配置文件就可以进行使用。

该类是整个schedulerfactorybean执行顺序的入口配置,也是我们进行初始化分析的起点和入口,接下来我们主要该类的源码类以及它的继承关系式是怎样的。

源码类schedulerfactorybean与继承关系图

上图是我们切入到schedulerfactorybean中的源码的截图,上图中我们可以清楚的看到该类继承哪些相关的类以及实现了哪些相关接口。

研究过spring源码分析的朋友应该知道,只要是实现了InitializingBean得类,那么spring在执行的时候,就会解析一个叫BeanDefinition的类,然后将该类进行初始化以后会调用SchedulerFactoryBean源码类中的一个名叫afterPropertiesSet()的方法,接下来我们就跳到该类的初始化方法中进行初始化分析以及执行顺序分析。

2)SchedulerFactory工厂类初始化执行

上一步中,我们已经跳到了afterPropertiesSet()方法中,接下来我们按照执行顺序一步一步的进行分析,在这里由于源码类中的方法众多并且繁杂,我们只涉及到的关键代码进行剖析。

afterPropertiesSet()方法中首先会调用一个instantiateClass方法初始化一个SchedulerFactory工厂类,如下图所示,该工厂里是调用的默认配置进行执行的,它的默认参数执行的是StdSchedulerFactory.class。

SchedulerFactory初始化代码

如果我们想要个性化设置或者自定义配置的话我们也可以将那个默认配置类进行修改,可以修改schedulerFactoryClass为其它接口的实现,比如RemoteScheduler的子类。

SchedulerFactory初始化完成之后,接下来要调用的方法叫initSchedulerFactory方法,下图是我们列出的该方法的业务逻辑,有兴趣的朋友可以详细研读一下其中的业务。

initSchedulerFactory方法源码详情

以上就是initSchedulerFactory方法的实际源码贴图,其中的业务逻辑也是很复杂的,我们有必要一一捋顺下其业务的初始化执行流程。

该方法仔细分析主要有以下两个核心步骤,第一个就是StdSchedulerFactory直接跳过拦截不对其进行参数检查,而其他的SchedulerFactory必须要一一对其进行参数检查,第二个核心步骤就是将一些属性加载到mergedProps字典中,加载的这些属性如下图所示,其中task的线程池以及线程池的数量设置属性、spring资源加载的类以及spring配置文件中的值。

mergedProps字典中加载的属性详情

3)SchedulerFactory初始化完成后续业务执行

到此为止,schedulerfactorybean初始化就基本完成了,接下来是一些后续的收尾工作,具体详见下图中的代码。

SchedulerFactory后续业务代码详情一

SchedulerFactory后续业务代码详情二

根据上图中的业务代码我们可以看到schedulerfactory的后续收尾工作还是有很多的,其中包括:registerJobsAndTriggers触发器的注册和使用、调度监听器的注册与使用以及创建调度器的方法,还有上下文内容调用以及Spring的ApplicationContext属性设置等后续的工作。

SchedulerFactory后续收尾工作详情

二、Quartz与spring框架配置应用

讲了以上那么多的执行顺序和初始化了源码分析,接下来要讲一下schedulerfactorybean与spring框架整合配置在项目中的实际应用。

其实spring整合该技术是非常简单的,只需要两步就可以实现一个定时器的编写与开发,第一步:写一个定时器的任务类,该类主要需要继承TimerTask类,然后重写其中的run()方法,主要run()方法中编写我们的定时任务所需要执行的业务逻辑。

定时器任务类详细代码

第二步就是在spring的bean配置文件中将定时器任务类以bean的方式注册到容器中去,然后配置文件中配置一个CronTriggerBean类。

该类主要编写定时器的执行规则,上面编写exception表达式,在表达式中根据表达式的语法结构编写多长时间执行一次改任该定时任务的执行规则,具体表达式的语法编写参见文章:crontriggerbean配置表达式详解与项目案例,然后配置文件再配置schedulerfactorybean类用于定时器任务的初始化。

定时器在spring配置文件中的配置代码详细