导语
- 接上一篇文章对elastic-job初始,本篇逐步分析里面逻辑,由浅入深反复分析
- 本篇调式代码入口是以elasticjob-example-lite-springboot为案例进行分析的
ScheduleJobBootstrap初始化分析
获取作业监听器
- 遍历作业配置jobListenerTypes,并通过ElasticJobListenerFactory#createListener创建作业监听器ElasticJobListener
–> 案例里没有相关配置,返回为空
初始化SetUpFacade
根据SPI机制获取作业名
- 在JobClassNameProviderFactory静态块初始化时,类加载JobClassNameProvider,将所有的JobClassNameProvider类放到PROVIDERS容器中(示例中不存在)
- 在获取provider时,如果不存在,elasticjob提供一个默认的DefaultJobClassNameProvider
- 关于作业类名称提供策略官网介绍:https://shardingsphere.apache.org/elasticjob/current/cn/dev-manual/job-class-provider/
建立作业配置
- 判断注册中心(zk)上是否存在 / + jobName节点
1.1 如果不存在,则直接返回(调式走此分支)
1.2 如果存在,则获取 / + jobName节点的内容(作业类名),如果类名发生冲突则抛出异常JobConfigurationException - 判断注册中心(zk)上是否不存在 / + jobName + /config节点或者作业配置是否被重写
2.1 是,则更新 / + jobName + /config节点的作业配置和更新 / + jobName节点的作业类名,并且直接返回作业配置(调式走此分支)
2.2 否,则从zk中获取配置
校验作业错误Handler属性
- 如果作业配置jobErrorHandlerType不为空,则
1.1 从ElasticJobServiceLoader的TYPED_SERVICE_CLASSES获取JobErrorHandlerPropertiesValidator类型的TypedSPI,然后进行初始化
(1)调式结果为DingtalkJobErrorHandlerPropertiesValidator
1.2 如果TypedSPI属于SPIPostProcessor,则调用其init(props)方法进行初始化
- 如果存在,则调用JobErrorHandlerPropertiesValidator#validate验证作业配置props
创建作业调度控制器(重点)
- 初始化JobScheduleController
1.1 创建调度器Scheduler(quartz包的)
(1)初始化StdSchedulerFactory,并通过工厂获取Scheduler
(2)为Scheduler的监听管理器添加触发监听器:JobTriggerListener
1.2 创建JobDetail(quartz包的)
(1)初始化JobDetailImpl,设置Jobclass属性(LiteJob)、key属性(jobName封装的JobKey)
(2)设置JobDetail属性jobDataMap(“jobExecutor”,“jobExecutor”) - 将JobScheduleController注册到JobRegistry中
–>schedulerMap.put(jobName, jobScheduleController);
启动调度引导类ScheduleJobBootstrap
- 从容器中获取调度引导类:ScheduleJobBootstrap
- 遍历调用其schedule方法(最终会调用)
2.1 如果scheduler不存在jobName的key,则调用StdScheduler#scheduleJob(quart包的)
–>在调用前,会根据corn创建触发器
2.2 调用StdScheduler#start启动调度任务(quart包的)
总结
- 上文只是对创建引导类以及启动引导类做个整体介绍,去除部分细节,后续还会针对里面的细节做详细分析
- 后面重点会关注里面调度线程模型