罗展丰
Published on 2026-07-09 / 28 Visits
0
0

初始化模块架构设计

Init 模块架构设计

1. 模块概述

Init 模块负责系统启动时的种子数据初始化,通过统一的 AbstractInitializer 抽象基类管理各子系统的初始化流程,支持全量执行和按编码单独执行两种模式。

2. 架构分层

┌─────────────────────────────────────────────┐
│              InitController                 │  REST API 入口
├─────────────────────────────────────────────┤
│              InitService                    │  调度编排层
├─────────────────────────────────────────────┤
│        AbstractInitializer (框架)           │  抽象基类 + 生命周期钩子
├──────┬──────┬──────┬──────┬──────┬──────────┤
│ CsD  │ CsU  │ Warn │ Dict │ Enc  │ Schedule │  具体 Initializer 实现
│ ispa │ plo  │      │ Meta │ oder │          │
│ tch  │ ad   │      │      │      │          │
└──────┴──────┴──────┴──────┴──────┴──────────┘
         ↓            ↓           ↓
    CsDispatch   WarnInit   DictInvoke   ...  业务 Service
    Service      Service    Service

3. 核心组件

3.1 AbstractInitializer(框架层)

位于 com.sie.mbm.mom.framework.seeddata.init,提供:

方法 说明
getName() 初始化任务名称
getCode() 唯一编码,用于按编码执行
execute() 子类实现的具体初始化逻辑
doExecute() 框架调用入口,封装 onStart → execute → onEnd 生命周期
onStart() 执行前钩子
onEnd(long costTime) 执行后钩子,记录耗时

3.2 InitializerConfig(框架层)

注册中心,维护所有 AbstractInitializer 实例列表,通过 getInitializerList() 对外提供。

3.3 InitService(业务层)

方法 职责
getList() 从 InitializerConfig 获取所有初始化任务,返回名称和编码列表
executeAll() 遍历执行所有 Initializer,收集成功/失败结果
executeByCode(String code) 按编码查找并执行单个 Initializer,未找到抛出异常

3.4 InitController(API 层)

提供 REST 接口,基础路径 /sys/v1/init。

4. 已注册的 Initializer

名称 编码 委托服务 说明
集团多工厂下发 csDispatch CsDispatchService 初始化下发配置
集团多工厂归集 csUpload CsUploadService 初始化归集配置
预警 warn WarnInitService 初始化预警规则
字典元数据初始化 dict DictInvokeService 发布字典元数据
编码规则 encoder EncoderSeedDataLoader 加载编码规则种子数据
定时任务 schedule ScheduleInitService 初始化定时任务配置

5. 执行流程

5.1 全量执行 (executeAll)

请求 POST /sys/v1/init/start-all
  → InitService.executeAll()
    → InitializerConfig.getInitializerList()
    → for each initializer:
        try:
          initializer.doExecute()
          → onStart()
          → execute()          // 子类实现
          → onEnd(costTime)
          记录到 successList
        catch Exception:
          记录到 failList
    → 返回 { "success": [...], "fail": [...] }

5.2 按编码执行 (executeByCode)

请求 POST /sys/v1/init/start/{code}
  → InitService.executeByCode(code)
    → 遍历 InitializerConfig 查找 code 匹配的 initializer
    → initializer.doExecute()
    → 未找到则抛出 IllegalArgumentException

6. 扩展方式

新增初始化任务只需:

  1. 创建类继承 AbstractInitializer
  2. 添加 @Component 注解(自动注册到 Spring 容器,框架自动收集)
  3. 实现 getName()、getCode()、execute() 三个方法
@Component
public class XxxInitializer extends AbstractInitializer {
    @Override
    public String getName() { return "XXX初始化"; }

    @Override
    public String getCode() { return "xxx"; }

    @Override
    public void execute() {
        // 初始化逻辑
    }
}

7. 注意事项

  • 所有 Initializer 通过 Spring @Component 自动注册,无需手动配置
  • executeAll 中单个 Initializer 失败不影响其他任务执行
  • executeByCode 找不到编码时抛出 IllegalArgumentException
  • demo 目录下的示例代码已注释,不会参与初始化

Comment