# ModelRT 异步任务 API 文档 ## 1. 概述 ModelRT 异步任务系统基于 RabbitMQ 消息驱动,提供完整的任务生命周期管理。任务创建后进入队列,由后台 Worker 消费并执行,调用方可通过轮询接口获取进度和结果。 **Base URL**: `http://{host}:{port}`(默认 `localhost:8080`) **鉴权**: 公开接口需在 Header 中携带 `X-Service-Token`(由服务端启动时生成)。 --- ## 2. API 端点总览 | 方法 | 路径 | 描述 | 权限 | | :----- | :--------------------------------- | :--------------- | :----- | | POST | `/task/async` | 创建异步任务 | 公开 | | GET | `/task/async/results` | 批量查询任务结果 | 公开 | | GET | `/task/async/{task_id}` | 查询单个任务详情 | 公开 | | POST | `/task/async/{task_id}/cancel` | 取消异步任务 | 公开 | | POST | `/task/internal/async/progress` | 更新任务进度 | 内部 | | POST | `/task/internal/async/status` | 更新任务状态 | 内部 | --- ## 3. 通用响应结构 ### 成功响应 ```json { "code": 2000, "msg": "success message", "payload": {} } ``` ### 失败响应 ```json { "code": 4001, "msg": "error description", "payload": null } ``` ### 响应码说明 | code | 含义 | | :--- | :--------------------- | | 2000 | 成功 | | 3000 | 处理失败 | | 4001 | 请求参数无效 | | 4002 | 未授权(Token 无效) | | 5000 | 服务器内部错误 | --- ## 4. 详细接口说明 ### 4.1 创建异步任务 **POST** `/task/async` 创建新的异步任务,任务进入队列等待 Worker 消费。返回 `task_id` 用于后续查询。 **请求头** ``` Content-Type: application/json X-Service-Token: ``` **请求体** ```json { "task_type": "TOPOLOGY_ANALYSIS", "params": { } } ``` | 字段 | 类型 | 必填 | 说明 | | :---------- | :----- | :--- | :-------------------------------------------------------------------------------- | | `task_type` | string | 是 | 任务类型,枚举值见 §5.1 | | `params` | object | 是 | 任务参数,不同任务类型的参数结构见 §5.3 | **成功响应** `200` ```json { "code": 2000, "msg": "task created successfully", "payload": { "task_id": "123e4567-e89b-12d3-a456-426614174000" } } ``` **失败响应** | 场景 | code | msg | | :----------------- | :--- | :-------------------------- | | 参数格式错误 | 4001 | invalid request parameters | | task_type 不合法 | 4001 | invalid task type | | params 内容不合法 | 4001 | invalid task parameters | | 数据库连接失败 | 5000 | database connection error | | 任务写库失败 | 5000 | failed to create task | **curl 示例** ```bash curl -X POST "http://localhost:8080/task/async" \ -H "Content-Type: application/json" \ -H "X-Service-Token: " \ -d '{ "task_type": "TOPOLOGY_ANALYSIS", "params": { "start_component_uuid": "550e8400-e29b-41d4-a716-446655440000", "end_component_uuid": "550e8400-e29b-41d4-a716-446655440001", "check_in_service": true } }' ``` --- ### 4.2 批量查询任务结果 **GET** `/task/async/results` 根据一组任务 ID 批量查询状态和结果,适用于轮询多个任务。 **Query 参数** | 参数 | 类型 | 必填 | 说明 | | :--------- | :----- | :--- | :----------------------------------- | | `task_ids` | string | 是 | 逗号分隔的 UUID 列表,最少 1 个 | **请求示例** ``` GET /task/async/results?task_ids=123e4567-e89b-12d3-a456-426614174000,223e4567-e89b-12d3-a456-426614174001 ``` **成功响应** `200` ```json { "code": 2000, "msg": "query completed", "payload": { "total": 2, "tasks": [ { "task_id": "123e4567-e89b-12d3-a456-426614174000", "task_type": "TOPOLOGY_ANALYSIS", "status": "RUNNING", "progress": 50, "created_at": 1741846200 }, { "task_id": "223e4567-e89b-12d3-a456-426614174001", "task_type": "PERFORMANCE_ANALYSIS", "status": "COMPLETED", "progress": 100, "created_at": 1741846200, "finished_at": 1741846260, "result": { "components_analyzed": 5 } } ] } } ``` **失败响应** | 场景 | code | msg | | :----------------- | :--- | :-------------------------- | | 缺少 task_ids | 4001 | task_ids parameter is required | | UUID 格式不合法 | 4001 | invalid task ID format | | 数据库连接失败 | 5000 | database connection error | | 查询失败 | 5000 | failed to query tasks | **curl 示例** ```bash curl "http://localhost:8080/task/async/results?task_ids=123e4567-e89b-12d3-a456-426614174000" ``` --- ### 4.3 查询单个任务详情 **GET** `/task/async/{task_id}` 查询单个任务的完整信息,包含结果或错误详情。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | :-------- | :----- | :--- | :-------------- | | `task_id` | string | 是 | 任务 UUID | **成功响应** `200` ```json { "code": 2000, "msg": "query completed", "payload": { "task_id": "123e4567-e89b-12d3-a456-426614174000", "task_type": "TOPOLOGY_ANALYSIS", "status": "COMPLETED", "progress": 100, "created_at": 1741846200, "finished_at": 1741846260, "result": { "path_exists": true, "path_length": 3, "path_nodes": ["comp-001", "comp-005", "comp-999"] } } } ``` 任务失败时 payload 附带错误信息: ```json { "code": 2000, "msg": "query completed", "payload": { "task_id": "123e4567-e89b-12d3-a456-426614174000", "task_type": "TOPOLOGY_ANALYSIS", "status": "FAILED", "created_at": 1741846200, "finished_at": 1741846210, "error_code": 400102, "error_message": "Component UUID not found", "error_detail": { "component_uuid": "550e8400-0000-0000-0000-000000000000" } } } ``` **失败响应** | 场景 | code | msg | | :----------------- | :--- | :-------------------------- | | 缺少 task_id | 4001 | task_id parameter is required | | UUID 格式不合法 | 4001 | invalid task ID format | | 任务不存在 | 404 | task not found | | 数据库连接失败 | 5000 | database connection error | **curl 示例** ```bash curl "http://localhost:8080/task/async/123e4567-e89b-12d3-a456-426614174000" ``` --- ### 4.4 取消异步任务 **POST** `/task/async/{task_id}/cancel` 取消指定任务。**仅 `SUBMITTED`(排队中)状态的任务可以被取消**,已开始执行(`RUNNING`)或已结束的任务无法取消。 取消后任务状态变为 `FAILED`,错误码 `40003`,错误信息 `task cancelled by user`。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | :-------- | :----- | :--- | :-------- | | `task_id` | string | 是 | 任务 UUID | **成功响应** `200` ```json { "code": 2000, "msg": "task cancelled successfully" } ``` **失败响应** | 场景 | code | msg | | :----------------------- | :--- | :--------------------------------------------------------- | | 缺少 task_id | 400 | task_id parameter is required | | UUID 格式不合法 | 400 | invalid task ID format | | 任务不存在 | 404 | task not found | | 任务已执行或已完成 | 400 | task cannot be cancelled (already running or completed) | | 数据库连接失败 | 500 | database connection error | | 取消操作失败 | 500 | failed to cancel task | **curl 示例** ```bash curl -X POST "http://localhost:8080/task/async/123e4567-e89b-12d3-a456-426614174000/cancel" ``` --- ### 4.5 内部接口:更新任务进度 **POST** `/task/internal/async/progress` 由 Worker 内部调用,更新任务执行进度(0-100)。 **请求体** ```json { "task_id": "123e4567-e89b-12d3-a456-426614174000", "progress": 75 } ``` | 字段 | 类型 | 必填 | 说明 | | :--------- | :----- | :--- | :---------------- | | `task_id` | string | 是 | 任务 UUID | | `progress` | int | 是 | 进度值,范围 0-100 | **成功响应** `200` ```json { "code": 2000, "msg": "task progress updated successfully", "payload": null } ``` --- ### 4.6 内部接口:更新任务状态 **POST** `/task/internal/async/status` 由 Worker 内部调用,更新任务状态。当状态更新为 `COMPLETED` 或 `FAILED` 时,同步写入 `finished_at` 时间戳。 **请求体** ```json { "task_id": "123e4567-e89b-12d3-a456-426614174000", "status": "RUNNING", "timestamp": 1741846205 } ``` | 字段 | 类型 | 必填 | 说明 | | :---------- | :----- | :--- | :--------------------------------------- | | `task_id` | string | 是 | 任务 UUID | | `status` | string | 是 | 目标状态,枚举值见 §5.2 | | `timestamp` | int64 | 是 | 状态变更时间戳(Unix 秒) | **成功响应** `200` ```json { "code": 2000, "msg": "task status updated successfully", "payload": null } ``` --- ## 5. 数据结构参考 ### 5.1 任务类型(task_type) | 枚举值 | 描述 | | :--------------------- | :----------- | | `TOPOLOGY_ANALYSIS` | 拓扑连通性分析 | | `PERFORMANCE_ANALYSIS` | 性能分析 | | `EVENT_ANALYSIS` | 事件分析 | | `BATCH_IMPORT` | 批量数据导入 | | `TEST` | 测试任务(系统验证用) | ### 5.2 任务状态(status) | 枚举值 | 描述 | 可转换至 | | :---------- | :----------------- | :------------------------------ | | `SUBMITTED` | 已提交至队列 | `RUNNING`, `FAILED`(取消) | | `RUNNING` | 正在执行 | `COMPLETED`, `FAILED` | | `COMPLETED` | 执行成功 | — | | `FAILED` | 执行失败或被取消 | — | ### 5.3 各任务类型的 params 结构 #### TOPOLOGY_ANALYSIS — 拓扑连通性分析 分析两个元件之间是否存在连通路径。 ```json { "start_component_uuid": "550e8400-e29b-41d4-a716-446655440000", "end_component_uuid": "550e8400-e29b-41d4-a716-446655440001", "check_in_service": true } ``` | 字段 | 类型 | 必填 | 说明 | | :--------------------- | :------ | :--- | :------------------------------------- | | `start_component_uuid` | string | 是 | 起始元件 UUID | | `end_component_uuid` | string | 是 | 目标元件 UUID | | `check_in_service` | boolean | 否 | 是否只检查投运状态元件,默认 `true` | #### PERFORMANCE_ANALYSIS — 性能分析 ```json { "component_ids": ["comp-001", "comp-002"], "time_range": { "start": "2026-03-01T00:00:00Z", "end": "2026-03-02T00:00:00Z" } } ``` | 字段 | 类型 | 必填 | 说明 | | :--------------- | :------- | :--- | :------------------ | | `component_ids` | []string | 是 | 待分析的元件 ID 列表(至少 1 个) | | `time_range` | object | 否 | 分析时间范围 | #### EVENT_ANALYSIS — 事件分析 ```json { "event_type": "MOTOR_START", "start_time": "2026-03-01T00:00:00Z", "end_time": "2026-03-02T00:00:00Z", "components": ["comp-001", "comp-002"] } ``` | 字段 | 类型 | 必填 | 说明 | | :------------ | :------- | :--- | :------------------ | | `event_type` | string | 是 | 事件类型 | | `start_time` | string | 否 | 事件起始时间(RFC3339) | | `end_time` | string | 否 | 事件截止时间(RFC3339) | | `components` | []string | 否 | 关联的元件列表 | #### BATCH_IMPORT — 批量导入 ```json { "file_path": "/data/import/model.csv", "file_type": "CSV", "options": { "overwrite": false, "validate": true, "notify_user": true } } ``` | 字段 | 类型 | 必填 | 说明 | | :--------------------- | :------ | :--- | :-------------------------------- | | `file_path` | string | 是 | 导入文件路径 | | `file_type` | string | 否 | 文件类型:`CSV`, `JSON`, `XML` | | `options.overwrite` | boolean | 否 | 是否覆盖已有数据,默认 `false` | | `options.validate` | boolean | 否 | 是否校验数据,默认 `true` | | `options.notify_user` | boolean | 否 | 完成后是否通知用户,默认 `true` | #### TEST — 测试任务 ```json { "sleep_duration": 30 } ``` | 字段 | 类型 | 必填 | 说明 | | :--------------- | :--- | :--- | :---------------------------------------------- | | `sleep_duration` | int | 否 | 模拟执行耗时(秒),默认 60,最大 3600 | ### 5.4 任务结果对象(AsyncTaskResult) | 字段 | 类型 | 说明 | | :-------------- | :----- | :--------------------------------------------------- | | `task_id` | string | 任务 UUID | | `task_type` | string | 任务类型 | | `status` | string | 当前状态 | | `progress` | int | 进度(0-100),仅 `RUNNING` 时返回 | | `created_at` | int64 | 创建时间戳(Unix 秒) | | `finished_at` | int64 | 完成时间戳(Unix 秒),仅 `COMPLETED`/`FAILED` 返回 | | `result` | object | 任务结果,仅 `COMPLETED` 时返回 | | `error_code` | int | 错误码,仅 `FAILED` 时返回 | | `error_message` | string | 错误描述,仅 `FAILED` 时返回 | | `error_detail` | object | 错误详情,仅 `FAILED` 时返回 | --- ## 6. 典型调用流程 ``` 创建任务 └─ POST /task/async └─ 返回 task_id 轮询状态(建议间隔 2-5 秒) └─ GET /task/async/{task_id} ├─ status=SUBMITTED → 继续等待 ├─ status=RUNNING → 查看 progress ├─ status=COMPLETED → 读取 result 字段 └─ status=FAILED → 读取 error_code / error_message 如需中止(仅 SUBMITTED 状态有效) └─ POST /task/async/{task_id}/cancel ``` --- ## 7. 队列配置参考 | 配置项 | 值 | | :------------- | :-------------------------- | | Exchange | `modelrt.tasks.exchange` | | Queue | `modelrt.tasks.queue` | | Routing Key | `modelrt.task` | | 优先级范围 | 0–10(默认 5) | | 消息 TTL | 24 小时 | | 最大重试次数 | 3 次 | | 重试初始延迟 | 1 秒(指数退避,最大 5 分钟)| --- **文档版本**: 1.1 **最后更新**: 2026-04-28 **相关文档**: [异步任务系统设计文档](./async_task_system.md)