当前位置: 首页 > news >正文

一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源

一、整体架构概览

DolphinScheduler 的插件体系基于 Java SPI(Service Provider Interface) 机制,配合 Google AutoService 自动生成注册文件,实现了零侵入的插件化扩展

dolphinscheduler-spi ← 核心接口层(SPI基础设施) dolphinscheduler-datasource-plugin ← 数据源插件层 dolphinscheduler-task-plugin ← Task插件层 dolphinscheduler-worker ← 插件消费层(Worker执行任务)

二、SPI 基础设施

PrioritySPI (接口) └── getIdentify(): SPIIdentify ← 插件唯一标识 + 优先级 └── compareTo(Integer) ← 优先级比较

PrioritySPIFactory 是插件发现的核心引擎

通过 Java 标准 ServiceLoader 扫描 classpath for (T t : ServiceLoader.load(spiClass)) { if (map.containsKey(t.getIdentify().getName())) { resolveConflict(t); // 同名插件按优先级决策,优先级相同则抛异常 } else { map.put(t.getIdentify().getName(), t); } }

插件注册方式:每个插件模块使用 @AutoService 注解,编译时自动在 META-INF/services/ 下生成 SPI 配置文件,无需手动维护

三、数据源插件详细流程

3.1 接口层次结构

DataSourceChannelFactory (SPI入口) └── getName() ← 插件唯一名称,如 "MYSQL" └── create() ← 创建 DataSourceChannel DataSourceChannel (通道) └── createAdHocDataSourceClient() ← 创建临时连接客户端 └── createPooledDataSourceClient() ← 创建连接池客户端 DataSourceClient (基础接口) └── getConnection(): Connection PooledDataSourceClient extends DataSourceClient └── createDataSourcePool() ← 创建 HikariCP 连接池

3.2 以 MySQL 为例的完整实现链

MySQLDataSourceChannelFactory ← @AutoService 注册 └── create() → MySQLDataSourceChannel └── createPooledDataSourceClient() → MySQLPooledDataSourceClient └── extends BasePooledDataSourceClient └── createDataSourcePool() → HikariDataSource ├── setDriverClassName() ├── setJdbcUrl() ├── setUsername() / setPassword() ├── setMinimumIdle() / setMaximumPoolSize() └── setConnectionTestQuery()

四、Task 插件详细流程

4.1 接口层次结构

TaskChannelFactory (SPI入口) extends UiChannelFactory, PrioritySPI └── getName() ← 插件类型名,如 "SHELL" └── create() ← 创建 TaskChannel └── getParams() ← 返回 UI 配置参数(前端渲染用) TaskChannel (通道) └── createTask(TaskExecutionContext) → AbstractTask └── parseParameters(ParametersNode) → AbstractParameters └── getResources(parameters) → ResourceParametersHelper └── cancelApplication(boolean) AbstractTask (任务执行基类) └── init() ← 初始化 └── handle(callback) ← 执行(抽象) └── cancel() ← 取消(抽象) └── getExitStatus() ← 根据 exitCode 返回状态

4.2 以 Shell 为例的完整实现链

ShellTaskChannelFactory ← @AutoService 注册 └── getName() → "SHELL" └── getParams() → [nodeName, runFlag, ...] ← 前端UI参数 └── create() → ShellTaskChannel └── createTask(ctx) → ShellTask └── handle(callback) └── ShellCommandExecutor.run(shellActuatorBuilder) └── 执行 Shell 脚本进程

五、两种插件的关键对

http://www.jsqmd.com/news/1080079/

相关文章:

  • OpCore Simplify:重构黑苹果配置的技术框架与智能解决方案
  • 2026年苏州厂家用了这款8寸晶圆专用衬纸,良率提升0.5%!
  • 工厂短视频培训/618流量红利别浪费,工业品短视频培训巧妙借势涨曝光
  • COMSOL多孔介质二氧化碳驱油模拟
  • 计算机毕业设计之jsp基于SSM的问卷调查平台的设计与实现
  • Linux 策略路由深度解析
  • IntelliJ IDEA 2025安装包校验失败?JetBrains官网已悄然下架SHA-256旧签名证书——紧急启用新校验密钥指南(仅限48小时内有效)
  • 开封全屋定制谁家最便宜
  • Delphi 设计期窗口DPI设置
  • 关于激光管安装的相关事宜
  • 计算机毕业设计之基于SSM的锦州风味美食推广系统设计与实现
  • AI真能替代安全专家吗?聊聊AI技术在入侵检测系统中的作用与挑战
  • 亲子娱乐想让家庭再来,不能只让孩子玩、大人等
  • GHelper终极指南:华硕笔记本性能调校的完整解决方案
  • 对比中法意英日五国服饰溢价系数,量化不同国家文化赋予服装的附加价值。
  • 终极Windows右键菜单管理指南:ContextMenuManager完全使用教程
  • Windows 7 SP2完整方案深度解析:让经典系统在现代硬件上重获新生
  • 用「丢了目标函数的训练任务」比喻,聊聊长期提不起劲怎么破
  • 告别环境配置噩梦:我用FlyEnv三天,彻底扔掉了Docker Desktop
  • 《断魂剑》定档 7 月 21 日 爱奇艺优酷双平台燃爆今夏
  • Scale-Across场景与技术方案初探
  • python网络爬虫学习
  • 低代码与原生开发博弈,2026 小程序开发行业技术趋势报告
  • Window 安装 MySQL流程(可视化工具)
  • 终极NVIDIA Profile Inspector使用指南:解锁显卡隐藏性能的免费神器
  • DVWA文件包含漏洞实战:从原理到高级利用与防御
  • 你的ERP/MES成本数据为什么不准?问题可能出在BOM的数据治理上
  • okbiye AI 数据分析:零基础一键生成论文数据报告,甩掉 SPSS 繁琐操作
  • 安卓APK反编译与防护实战:从JADX原理到多层次安全加固
  • 第8篇:初遇Power Query——一键清洗大区报表