一、任务定义与配置管理
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"
- Given 任务配置缺少
Scenario 3: 配置文件热更新
- Given 已运行任务A,修改其Cron表达式为
0/10 * * * * ?
并保存 - When 配置文件更新后
- Then 任务A自动重新加载新配置,下次触发间隔变为10秒
- Given 已运行任务A,修改其Cron表达式为
二、任务触发
2.1 定时任务(Cron)
验收场景: 精确触发与异常处理
Scenario 1: 标准Cron触发
- Given 配置
"triggerType": "Cron", "triggerExpression": "0/5 * * * * ?"
- When 系统时间达到
12:00:00
- Then 任务在
12:00:00
±1秒内触发,日志记录触发时间戳
- Given 配置
Scenario 2: 无效Cron表达式
- Given 配置
"triggerExpression": "0 0 * * *"
(缺少秒字段) - When 加载配置文件时
- Then 框架启动失败并抛出异常,日志提示"Cron表达式格式错误"
- Given 配置
2.2 事件驱动任务
验收场景: 事件绑定与触发
Scenario 1: 事件类绑定触发
- Given 配置
"triggerType": "Event", "triggerExpression": "MyApp.PaymentSuccessEvent"
- When 外部调用
EventBus.fire(new PaymentSuccessEvent())
- Then 任务被立即触发,日志记录事件来源与任务ID
- Given 配置
Scenario 2: 未实现接口的事件类
- Given 事件类未实现
IEventListener
接口 - When 加载配置文件时
- Then 框架拒绝加载,日志提示"Class MyApp.InvalidEvent does not implement IEventListener"
- Given 事件类未实现
三、任务执行与容错
3.1 失败重试机制
验收场景: 重试策略与终止处理
Scenario 1: 指数退避重试
- Given 配置
"retryPolicy": { "maxRetries": 3, "backoff": "Exponential" }
- When 任务连续失败3次
- Then 重试间隔为1s→2s→4s,最终状态标记为“失败”,触发回调通知
- Given 配置
Scenario 2: 超时终止
- Given 任务配置
"timeout": "300s"
- When 任务执行超过300秒未完成
- Then 强制终止任务并标记为“超时”,释放线程资源
- Given 任务配置
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筛选日志
- Given 任务ID为
Scenario 2: 敏感数据脱敏
- Given 任务参数包含
"password": "123456"
- When 记录执行日志
- Then 日志中显示
"password": "******"
- Given 任务参数包含
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"
- Given 报警规则
五、插件化扩展
5.1 自定义触发器插件
验收场景: 插件加载与冲突处理
Scenario 1: SPI机制加载插件
- Given 实现
ITriggerPlugin
接口的JAR包放入/plugins
目录 - When 框架启动时
- Then 插件被加载,支持配置
"triggerType": "MQ"
- Given 实现
Scenario 2: 插件冲突处理
- Given 两个插件声明相同的
triggerType
- When 启动框架
- Then 日志提示"Duplicate plugin type: MQ",仅加载首个插件
- Given 两个插件声明相同的
六、安全与稳定性
6.1 敏感数据加密
验收场景: 加密存储与内存解密
- Scenario 1: 数据库密码加密
- Given 配置
"password": "{AES}ENCRYPTED_STRING"
- When 框架启动连接数据库
- Then 内存中使用解密后的明文密码,日志中无明文泄露
- Given 配置
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 框架读取持久化状态,未完成任务重新加入队列
交付物要求
- 自动化测试覆盖:
- 单元测试覆盖率 ≥80%(核心模块需≥95%)
- 集成测试用例覆盖所有触发类型与容错场景
- 文档清单:
- 《任务配置指南》
- 《插件开发手册》
- 《监控与报警配置说明》
通过以上验收标准,可逐项验证框架是否满足需求文档中定义的功能与非功能目标,确保交付质量。