Skip to content

一、任务定义与配置管理

1.1 任务元数据配置

验收场景: 配置解析与动态加载

  • Scenario 1: 支持JSON/YAML配置解析

    • Given 任务配置文件包含完整元数据(taskId、triggerType、priority等)
    • When 框架启动加载配置文件
    • Then 任务被正确解析并注册到任务管理器,日志输出"Task [OrderTimeoutCheck] registered successfully"
  • Scenario 2: 必填字段缺失处理

    • Given 任务配置缺少taskId字段
    • When 加载配置文件时
    • Then 框架拒绝加载并抛出异常,日志提示"Missing required field: taskId"
  • Scenario 3: 配置文件热更新

    • Given 已运行任务A,修改其Cron表达式为0/10 * * * * ?并保存
    • When 配置文件更新后
    • Then 任务A自动重新加载新配置,下次触发间隔变为10秒

二、任务触发

2.1 定时任务(Cron)

验收场景: 精确触发与异常处理

  • Scenario 1: 标准Cron触发

    • Given 配置"triggerType": "Cron", "triggerExpression": "0/5 * * * * ?"
    • When 系统时间达到12:00:00
    • Then 任务在12:00:00±1秒内触发,日志记录触发时间戳
  • Scenario 2: 无效Cron表达式

    • Given 配置"triggerExpression": "0 0 * * *"(缺少秒字段)
    • When 加载配置文件时
    • Then 框架启动失败并抛出异常,日志提示"Cron表达式格式错误"

2.2 事件驱动任务

验收场景: 事件绑定与触发

  • Scenario 1: 事件类绑定触发

    • Given 配置"triggerType": "Event", "triggerExpression": "MyApp.PaymentSuccessEvent"
    • When 外部调用EventBus.fire(new PaymentSuccessEvent())
    • Then 任务被立即触发,日志记录事件来源与任务ID
  • Scenario 2: 未实现接口的事件类

    • Given 事件类未实现IEventListener接口
    • When 加载配置文件时
    • Then 框架拒绝加载,日志提示"Class MyApp.InvalidEvent does not implement IEventListener"

三、任务执行与容错

3.1 失败重试机制

验收场景: 重试策略与终止处理

  • Scenario 1: 指数退避重试

    • Given 配置"retryPolicy": { "maxRetries": 3, "backoff": "Exponential" }
    • When 任务连续失败3次
    • Then 重试间隔为1s→2s→4s,最终状态标记为“失败”,触发回调通知
  • Scenario 2: 超时终止

    • Given 任务配置"timeout": "300s"
    • When 任务执行超过300秒未完成
    • Then 强制终止任务并标记为“超时”,释放线程资源

3.2 资源隔离

验收场景: 线程池隔离与熔断

  • Scenario 1: 独立线程池分配

    • Given 高优先级任务配置独立线程池
    • When 低优先级任务线程池满载
    • Then 高优先级任务仍可正常执行,无资源竞争
  • Scenario 2: 线程池熔断

    • Given 线程池队列容量为100
    • When 积压任务数达到101
    • Then 新任务被拒绝,日志输出"ThreadPool [default] circuit-break triggered"

四、可观测性与监控

4.1 全链路日志追踪

验收场景: 日志关联与脱敏

  • Scenario 1: 任务ID追踪

    • Given 任务ID为TASK_001
    • When 任务执行过程中输出日志
    • Then 所有日志行包含[TaskID=TASK_001],支持按ID筛选日志
  • Scenario 2: 敏感数据脱敏

    • Given 任务参数包含"password": "123456"
    • When 记录执行日志
    • Then 日志中显示"password": "******"

4.2 监控与报警

验收场景: 指标采集与告警触发

  • Scenario 1: Prometheus指标暴露

    • Given 框架集成Prometheus客户端
    • When 访问/metrics端点
    • Then 返回tasks_executed_total, task_queue_size等指标
  • Scenario 2: 积压任务报警

    • Given 报警规则积压任务 > 1000
    • When 任务队列达到1001
    • Then 触发邮件/钉钉告警,日志记录"Alert: task backlog exceeds threshold"

五、插件化扩展

5.1 自定义触发器插件

验收场景: 插件加载与冲突处理

  • Scenario 1: SPI机制加载插件

    • Given 实现ITriggerPlugin接口的JAR包放入/plugins目录
    • When 框架启动时
    • Then 插件被加载,支持配置"triggerType": "MQ"
  • Scenario 2: 插件冲突处理

    • Given 两个插件声明相同的triggerType
    • When 启动框架
    • Then 日志提示"Duplicate plugin type: MQ",仅加载首个插件

六、安全与稳定性

6.1 敏感数据加密

验收场景: 加密存储与内存解密

  • Scenario 1: 数据库密码加密
    • Given 配置"password": "{AES}ENCRYPTED_STRING"
    • When 框架启动连接数据库
    • Then 内存中使用解密后的明文密码,日志中无明文泄露

6.2 进程守护

验收场景: 崩溃恢复

  • Scenario 1: 进程异常退出恢复
    • Given 使用Supervisor守护进程
    • When 手动杀死框架进程
    • Then Supervisor在5秒内自动重启,未完成任务恢复执行

七、性能与基准测试

7.1 吞吐量与延迟

验收场景: 压力测试

  • Scenario 1: 单机吞吐量

    • Given 使用JMeter发送100任务/秒请求
    • When 持续压测5分钟
    • Then 吞吐量≥100任务/秒,90%任务延迟≤30秒
  • Scenario 2: 高负载熔断

    • Given 线程池核心数=10,队列容量=100
    • When 瞬时提交200任务
    • Then 前110任务被接受,后90任务被拒绝

八、非功能性需求验证

8.1 可扩展性

验收场景: 核心与插件解耦

  • Scenario: 替换日志组件
    • Given 默认使用NLog,新增Log4j插件
    • When 修改配置logging.provider=log4j
    • Then 日志输出切换为Log4j格式,无需修改框架代码

8.2 单机高可用

验收场景: 任务状态持久化

  • Scenario: 进程崩溃恢复
    • Given 任务执行中突然断电
    • When 重启框架后
    • Then 框架读取持久化状态,未完成任务重新加入队列

交付物要求

  1. 自动化测试覆盖
    • 单元测试覆盖率 ≥80%(核心模块需≥95%)
    • 集成测试用例覆盖所有触发类型与容错场景
  2. 文档清单
    • 《任务配置指南》
    • 《插件开发手册》
    • 《监控与报警配置说明》

通过以上验收标准,可逐项验证框架是否满足需求文档中定义的功能与非功能目标,确保交付质量。