elastic-job注册定时任务引导类

本文深入解析ElasticJob的初始化过程与作业配置机制,包括作业监听器获取、作业类名称提供策略、作业配置建立及作业调度控制器创建等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导语

  1. 接上一篇文章对elastic-job初始,本篇逐步分析里面逻辑,由浅入深反复分析
  2. 本篇调式代码入口是以elasticjob-example-lite-springboot为案例进行分析的

ScheduleJobBootstrap初始化分析

在这里插入图片描述
在这里插入图片描述

获取作业监听器

  1. 遍历作业配置jobListenerTypes,并通过ElasticJobListenerFactory#createListener创建作业监听器ElasticJobListener
    –> 案例里没有相关配置,返回为空
初始化SetUpFacade

在这里插入图片描述

根据SPI机制获取作业名

  1. 在JobClassNameProviderFactory静态块初始化时,类加载JobClassNameProvider,将所有的JobClassNameProvider类放到PROVIDERS容器中(示例中不存在)
  2. 在获取provider时,如果不存在,elasticjob提供一个默认的DefaultJobClassNameProvider
    在这里插入图片描述
  3. 关于作业类名称提供策略官网介绍:https://shardingsphere.apache.org/elasticjob/current/cn/dev-manual/job-class-provider/

建立作业配置

  1. 判断注册中心(zk)上是否存在 / + jobName节点
    1.1 如果不存在,则直接返回(调式走此分支)
    1.2 如果存在,则获取 / + jobName节点的内容(作业类名),如果类名发生冲突则抛出异常JobConfigurationException
  2. 判断注册中心(zk)上是否不存在 / + jobName + /config节点或者作业配置是否被重写
    2.1 是,则更新 / + jobName + /config节点的作业配置和更新 / + jobName节点的作业类名,并且直接返回作业配置(调式走此分支)
    2.2 否,则从zk中获取配置
    在这里插入图片描述

校验作业错误Handler属性

在这里插入图片描述

  1. 如果作业配置jobErrorHandlerType不为空,则
    1.1 从ElasticJobServiceLoader的TYPED_SERVICE_CLASSES获取JobErrorHandlerPropertiesValidator类型的TypedSPI,然后进行初始化
    (1)调式结果为DingtalkJobErrorHandlerPropertiesValidator
    1.2 如果TypedSPI属于SPIPostProcessor,则调用其init(props)方法进行初始化
    在这里插入图片描述
  2. 如果存在,则调用JobErrorHandlerPropertiesValidator#validate验证作业配置props

创建作业调度控制器(重点)

在这里插入图片描述

  1. 初始化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”)
  2. 将JobScheduleController注册到JobRegistry中
    –>schedulerMap.put(jobName, jobScheduleController);

启动调度引导类ScheduleJobBootstrap

在这里插入图片描述

  1. 从容器中获取调度引导类:ScheduleJobBootstrap
  2. 遍历调用其schedule方法(最终会调用)
    2.1 如果scheduler不存在jobName的key,则调用StdScheduler#scheduleJob(quart包的)
    –>在调用前,会根据corn创建触发器
    2.2 调用StdScheduler#start启动调度任务(quart包的)

在这里插入图片描述
在这里插入图片描述

总结

  1. 上文只是对创建引导类以及启动引导类做个整体介绍,去除部分细节,后续还会针对里面的细节做详细分析
  2. 后面重点会关注里面调度线程模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值