罗展丰
Published on 2026-06-22 / 31 Visits
0
0

调度模块架构设计

一、概述

调度模块负责系统的定时任务管理,基于 PowerJob 分布式任务调度引擎,统一管理所有需要定时执行的后台任务(如预警扫描、数据同步、报表生成等)。业务模块通过配置调度记录即可接入,无需自行管理调度逻辑。


二、整体架构

┌──────────────────────────────────────────────────────────────┐
│                        业务层                                 │
│  预警模块 (warn)   数据同步   报表生成   ... (其他业务)          │
│      │                                                       │
│      │ schedule_id 关联                                      │
│      ▼                                                       │
└──────────────────┬───────────────────────────────────────────┘
                   │
┌──────────────────▼───────────────────────────────────────────┐
│                      调度模块 (schedule)                       │
│                                                              │
│  ScheduleController (CRUD / 启停 / 手动触发)                   │
│         │                                                    │
│         ▼                                                    │
│  ScheduleService (配置管理 / 作业注册 / 执行日志)                │
│         │                                                    │
│    ┌────┴─────┐                                              │
│    ▼          ▼                                              │
│  sys_schedule   sys_schedule_log                              │
│  (配置表)       (日志表)                                       │
│         │                                                    │
└─────────┼────────────────────────────────────────────────────┘
          │
┌─────────▼────────────────────────────────────────────────────┐
│                 PowerJob 分布式调度引擎                         │
│                                                              │
│  PowerJob Server (192.168.168.209:32544)                      │
│       │                                                      │
│       ▼                                                      │
│  PowerJob Worker (应用内嵌)                                    │
│       │                                                      │
│       ▼                              ┌─────────────────┐     │
│  IScheduleProcessor  ─────────────→   │ 业务处理器实现    │     │
│     (调度处理器接口)                    │ (WarnProcessor)  │     │
│                                       └─────────────────┘     │
└──────────────────────────────────────────────────────────────┘
  • PowerJob Server — 分布式调度中心,管理所有 Job 的注册、触发、分配
  • PowerJob Worker — 嵌入应用,接收调度指令并执行
  • 调度模块 — 封装 PowerJob,提供配置管理、日志记录、业务解耦
  • 业务模块 — 实现处理器接口,通过 schedule_id 与调度关联

三、数据库设计

3.1 sys_schedule(调度配置表)

字段 类型 说明
id bigint 主键
code varchar(250) 调度编码(唯一标识)
name varchar(250) 调度名称
cron_expression varchar(50) Cron 表达式
class_name varchar(250) 处理器全限定类名
job_id varchar(50) PowerJob 任务 ID(注册后回填)
is_enabled varchar(50) 是否启用
description varchar(500) 描述
param text 默认调度参数(JSON)

3.2 sys_schedule_log(调度执行日志表)

字段 类型 说明
id bigint 主键
schedule_id bigint 关联调度 ID
job_id varchar(50) PowerJob 任务 ID
status varchar(50) 运行状态(SUCCESS / FAILED)
result text 执行结果
error_message text 错误信息
error_stack text 错误堆栈
start_time datetime 开始时间
end_time datetime 结束时间
duration bigint 耗时(毫秒)
default_param text 默认参数(冗余快照)
run_param text 本次运行独立参数

四、核心流程

4.1 调度注册流程

用户创建调度配置 (POST /sys/v1/schedule)
  └→ ScheduleService.create()
       ├→ 持久化到 sys_schedule 表
       ├→ 构造 PowerJob 任务定义
       │    ├→ JobName = schedule.code
       │    ├→ Cron = schedule.cron_expression
       │    ├→ Processor = 通用分发处理器
       │    └→ JobParams = schedule.id (注入到上下文)
       ├→ 调用 PowerJob Client API 注册任务
       ├→ 回填 job_id 到 sys_schedule
       └→ PowerJob Server 按 cron 定时触发

4.2 调度执行流程

PowerJob Server 触发 cron
  └→ PowerJob Worker 接收任务
       └→ 通用分发处理器 (ScheduleProcessorDispatcher)
            ├→ 从 JobParams 取出 schedule_id
            ├→ 查询 sys_schedule 获取配置
            ├→ 创建 sys_schedule_log 记录 (status=RUNNING)
            ├→ 反射实例化 class_name 指定的处理器
            │    └→ IScheduleProcessor.execute(param)
            │         └→ 业务处理器执行具体逻辑
            ├→ 更新 sys_schedule_log
            │    ├→ status = SUCCESS / FAILED
            │    ├→ result / error_message / error_stack
            │    ├→ end_time / duration
            └→ 返回执行结果给 PowerJob

4.3 生命周期管理

用户操作                PowerJob 状态          sys_schedule 状态
─────────────────────────────────────────────────────────────────
创建调度               注册 Job               is_enabled = 1
停用调度               关闭 Job               is_enabled = 0
启用调度               恢复 Job               is_enabled = 1
删除调度               删除 Job               物理删除(级联日志)
手动触发               立即执行一次            记录日志

五、处理器接口

5.1 IScheduleProcessor

/**
 * 调度任务处理器接口
 * 所有需要定时执行的业务逻辑实现此接口
 */
public interface IScheduleProcessor {

    /**
     * 执行调度任务
     *
     * @param param 调度参数(来自 sys_schedule.param,JSON 格式)
     * @return 执行结果(写入 sys_schedule_log.result)
     */
    String execute(String param);
}

5.2 处理器注册方式

处理器通过 Spring Bean + class_name 全限定名方式定位:

  • 调度配置中 class_name 存储处理器全限定类名
  • 运行时反射获取 Spring 容器中的 Bean 实例
  • 新业务只需:实现 IScheduleProcessor → 注册为 Spring Bean → 配置 class_name

5.3 通用分发处理器

@Component
public class ScheduleProcessorDispatcher {

    public String dispatch(Long scheduleId) {
        // 1. 查配置
        ScheduleConfig config = scheduleService.getById(scheduleId);
        // 2. 写日志
        ScheduleLog log = scheduleService.createLog(config);
        // 3. 反射获取处理器
        IScheduleProcessor processor = getProcessor(config.getClassName());
        // 4. 执行
        String result = processor.execute(config.getParam());
        // 5. 更新日志
        scheduleService.updateLogSuccess(log, result);
        return result;
    }
}

六、PowerJob 配置

6.1 依赖

<dependency>
    <groupId>tech.powerjob</groupId>
    <artifactId>powerjob-worker-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>tech.powerjob</groupId>
    <artifactId>powerjob-client</artifactId>
    <version>4.3.6</version>
</dependency>

6.2 配置项

powerjob:
  worker:
    server-address: 192.168.168.209:32544  # PowerJob Server 地址
    enabled: false                          # 是否启用(开发/测试环境建议关闭)
    akka-port: 27777                        # 通信端口
    appName: sys                            # 应用名(需在 PowerJob Server 注册)

七、sys-api 层接口

sys-api 是提供给其他微服务调用的接口层,调度模块在此暴露:

sys-api/
└── schedule/
    ├── processor/
    │   └── IScheduleProcessor.java     # 处理器接口(业务实现)
    ├── seed/
    │   └── ScheduleSeedDTO.java        # 调度初始化种子数据
    └── listener/
        └── ScheduleEventListener.java  # 调度事件监听(预留)

7.1 Seed 机制

/**
 * 调度种子数据
 * 子服务启动时注册预定义的调度配置
 */
public class ScheduleSeedDTO {
    private String code;             // 调度编码
    private String name;             // 调度名称
    private String cronExpression;   // cron 表达式
    private String className;        // 处理器类名
    private String param;            // 默认参数
    private String description;      // 描述
}

八、状态枚举

ScheduleStatusEnum

值 说明
PENDING 待执行
RUNNING 执行中
SUCCESS 执行成功
FAILED 执行失败

ScheduleEnabledEnum

值 说明
0 停用
1 启用

九、目录结构

schedule/
├── controller/
│   └── ScheduleController.java        # 调度 CRUD API
├── service/
│   ├── ScheduleService.java           # 调度配置管理
│   ├── ScheduleProcessorDispatcher.java # 通用分发处理器
│   └── ScheduleLogService.java        # 执行日志管理
├── entity/
│   ├── Schedule.java                  # 对应 sys_schedule
│   └── ScheduleLog.java               # 对应 sys_schedule_log
├── mapper/
│   ├── ScheduleMapper.java
│   └── ScheduleLogMapper.java
├── dto/
│   ├── ScheduleCreateDTO.java
│   ├── ScheduleUpdateDTO.java
│   ├── SchedulePageDTO.java
│   └── ScheduleViewDTO.java
├── enums/
│   ├── ScheduleStatusEnum.java
│   └── ScheduleEnabledEnum.java
├── convert/
│   └── ScheduleConvert.java           # MapStruct
├── listener/
│   └── ScheduleEventListener.java     # 预留:PowerJob 事件监听
└── demo/
    └── DemoProcessor.java             # 演示处理器

Comment