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. 扩展方式
新增初始化任务只需:
- 创建类继承
AbstractInitializer - 添加
@Component注解(自动注册到 Spring 容器,框架自动收集) - 实现
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 目录下的示例代码已注释,不会参与初始化