高级篇 I: 作业的配置、注册、调度
来源:互联网 发布:唐小僧 知乎 编辑:程序博客网 时间:2024/06/02 19:31
前面撰写的“基础篇”、“使用篇”,基本阐述了如何使用elastic-job-lite进行定时作业的开发、监控,以及对作业做一些特殊处理,如作业监听。
在此后续的“高级篇”,我们开始深挖一下源代码层面,了解底层的实现及原理。
OK,不在絮叨,现在开始由浅入深,慢慢挖起。
作业配置
之前搭建的源码用例环境中,simple类型作业 和 dataflow类型作业, 分别对应都有个config类,
可见,两个代码共同之处(参照图中 标出的 1 处),两种作业config类最终返回的都是 JobScheduler,构造过程中,使用到了注册中心、具体的作业对象以及作业相关配置属性;
具体作业使用的配置信息,都是放在了LiteJobConfiguration (参照图中 标出的 2 处),只是对应不同作业类型时,又使用了具体不同的作业配置类型(参照图中 标出的 3 处 ):
- simple 类型作业,用的是 SimpleJobConfiguration
- dataflow类型作业,用的是 DataflowJobConfiguration
这两个作业配置类型,类间关系为 ,都实现同一个接口 JobTypeConfiguration。
而SimpleJobConfiguration 和 DataflowJobConfiguration 构建时,都使用到了JobCoreConfiguration。
一路下来,可见Elastic-Job配置分为3个层级,分别是Core, Type和Root。每个层级使用相似于装饰者模式的方式装配。
Core对应JobCoreConfiguration,用于提供作业核心配置信息,如:作业名称、分片总数、CRON表达式等。
Type对应JobTypeConfiguration,有3个子类分别对应SIMPLE, DATAFLOW和SCRIPT类型作业,提供3种作业需要的不同配置,如:DATAFLOW类型是否流式处理或SCRIPT类型的命令行等。
Root对应JobRootConfiguration,有2个子类分别对应Lite和Cloud部署类型,提供不同部署类型所需的配置,如:Lite类型的是否需要覆盖本地配置或Cloud占用CPU或Memory数量等。
作业的类间关系:
讲完了,不同作业如何进行配置,come on 继续,看看核心类JobScheduler如何。
作业注册、调度
用例环境中,SimpleJobConfig 和 DataflowJobConfig 中获取JobScheduler的方法上中,返回的都是 SpringJobScheduler;且方法上,都有注解 ,即bean初始化结束后会立马调用init方法
以SimpleJobConfig为例,
JobScheduler类间关系
进入JobScheduler,发现调用到一个私有的构造函数,完成添加作业实例、绑定作业监听器、通过外观模式装配各种service。
其中,JobRegistry使用了经典的通过double check和volatile方式,实现“单例模式”:
查看init方法,红色部分的代码,完成了作业注册、通过将作业关联到quartz,实现定时的作业调度,以及作业注册到Zookeeper
重点关注下createJobDetail 方法,通过LiteJob代理quartz中的Job:
至此,作业都扔到(或关联到)quartz上了,后续定时调度,就是quartz的定时机制去触发执行了。
下一篇,我们将讲述,quartz触发执行后, simple作业和dataflow作业 具体的执行过程 --高级篇 II: 作业的执行。
- 高级篇 I: 作业的配置、注册、调度
- 【操作系统】作业调度(高级调度)
- 【操作系统】作业调度(高级调度)
- Quartz作业调度框架配置
- C# Quartz作业调度配置
- C# Quartz作业调度配置
- quartz的作业调度
- oozie的作业调度
- MapReduce作业的调度
- 操作系统的作业调度
- quartz开源作业调度框架的配置举例
- 作业调度和进程调度的区别
- 进程调度与作业调度的不同点
- 作业调度和进程调度的区别
- 高级篇 II: 作业的执行
- 高级篇 III: 作业的分片
- 关于作业调度的程序
- 作业调度系统的简介
- android判断EditText字母开头
- python 内置函数 locals()和 globals()
- 谈谈一道js笔试题,涉及作用域链、闭包
- Hue安装与问题解决方案
- ThinkPHP导出百万条数据量
- 高级篇 I: 作业的配置、注册、调度
- setSupportActionBar(toolbar);导致出错的原因
- ORA-01658: 无法为表空间space中的段创建 INITIAL 区解决办法
- UDP主要丢包原因及具体问题分析
- Mangos源码分析(6):登录服的设计之功能需求
- maven settings.xml详解
- Oracle WorkFlow(工作流)详解
- Mangos源码分析(7):服务器公共组件实现之游戏主循环
- WdatePicker.js的使用方法 帮助文档 (日历控件)