该项目基于 Next.js App Router,实现了一个用于管理大规模文件处理任务的调度系统。支持从文本文件或手动输入导入待处理文件路径,并通过接口对任务状态进行统一分发与回传,同时提供可视化界面,便于查看任务轮进度、节点表现与历史统计。
- 批量导入:上传
.txt文件或粘贴多行文本,每行一个路径。 - 状态管理:内置"未处理、处理中、已完成、失败"四大队列,节点上报失败或任务超时时将立即进入失败队列。
- 超时管理:自动定时检查超时任务,可页面配置超时时间和检查间隔,超时的"处理中"任务会被自动标记为失败。
- 任务查询:支持按任务ID或文件路径查询任务的当前状态。
- 节点统计:记录各执行节点的处理速度、运行时间等性能数据,自动归档 2 小时前的历史记录,可分页查看。
- 任务轮完成统计:展示每个任务轮的完成率、累计处理项数、平均耗时等指标;当所有任务轮完成时,可自动向飞书机器人发送汇总通知。
- 全局概览:控制台顶部汇总全局完成轮次、成功/失败数、累计项数与时间。
- 调度接口:
POST /api/tasks/get_task:按批次分配任务。POST /api/tasks/set_task_status:回传任务执行结果及失败原因。POST /api/tasks/set_processed_info:上报节点处理速度统计。GET /api/tasks/search?query=xxx:查询任务状态。POST /api/tasks/check_timeout:检查并重置超时任务。
- 数据统计:统计各队列任务数量,支持分页与筛选。
- UI 控制台:实时刷新任务列表,支持调整每页数量及状态筛选,表格支持一键复制任务ID和路径(带反馈提示)。
| 变量名 | 默认值 | 说明 |
|---|---|---|
TASK_BATCH_SIZE |
10 |
调度接口默认每批返回的任务数量 |
TASK_BATCH_MAX |
1000 |
get_task 接口单次最大分发数量上限 |
TASK_PAGE_SIZE |
20 |
控制台接口默认分页大小 |
TASK_PAGE_MAX |
200 |
控制台接口允许的最大分页大小 |
FEISHU_WEBHOOK_URL / LARK_WEBHOOK_URL |
- |
(可选)全部任务轮完成时推送通知的飞书/ Lark 机器人地址。可在控制台页面中设置,环境变量仅用于提供默认值。 |
TASK_TIMEOUT_MS |
900000 |
任务超时时间(毫秒),默认15分钟 |
可以在根目录创建 .env.local 文件覆盖上述默认值:
TASK_BATCH_SIZE=50
TASK_TIMEOUT_MS=600000
pnpm install
pnpm dev启动后访问 http://localhost:3000。界面支持上传文件、查看队列、刷新统计等操作。
# POST /api/tasks/get_task
curl -X POST http://localhost:3000/api/tasks/get_task \
-H "Content-Type: application/json" \
-d '{"batchSize": 50}'
# 返回
[
{"task_id": "task_xxx", "body": "/path/to/file1.pdf"},
{"task_id": "task_yyy", "body": "/path/to/file2.pdf"}
]# POST /api/tasks/set_task_status
curl -X POST http://localhost:3000/api/tasks/set_task_status \
-H "Content-Type: application/json" \
-d '{
"task_id": "task_xxx",
"status": true,
"message": ""
}'# POST /api/tasks/set_processed_info
curl -X POST http://localhost:3000/api/tasks/set_processed_info \
-H "Content-Type: application/json" \
-d '{
"node_id": "node-001",
"item_num": 120,
"running_time": 45.5
}'# GET /api/tasks/search?query=xxx
curl "http://localhost:3000/api/tasks/search?query=task_xxx"
# 或通过文件路径查询
curl "http://localhost:3000/api/tasks/search?query=/path/to/file1.pdf"# POST /api/tasks/check_timeout
curl -X POST http://localhost:3000/api/tasks/check_timeout \
-H "Content-Type: application/json" \
-d '{"timeoutMs": 900000}'# GET /api/tasks/node_stats?page=1&pageSize=10&roundId=round_0001
curl "http://localhost:3000/api/tasks/node_stats?page=1&pageSize=10&roundId=round_0001"当全部任务轮处理完成后,系统会尝试向飞书(或 Lark)机器人发送汇总信息,内容包括成功/失败数量、累计处理项数、节点总耗时及平均耗时等。配置步骤如下:
- 在飞书群聊中添加“自定义机器人”,记录生成的 Webhook 地址(形如
https://open.feishu.cn/open-apis/bot/v2/hook/...)。 - 打开任务调度控制台,在“批次大小配置”卡片下的“飞书通知配置”中粘贴该地址并点击“保存配置”。若留空则表示关闭通知。
- 若希望在首次启动时自动填充该地址,可在
.env.local中设置FEISHU_WEBHOOK_URL(或LARK_WEBHOOK_URL)。页面保存成功后会覆盖该默认值。若机器人开启了安全关键词,请确保通知内容包含对应关键词。
data/rounds/*.json:任务轮快照文件,存储任务队列与节点汇总。data/node-stats.json:节点实时统计快照,独立于任务轮存储。data/node-history/<nodeId>.jsonl:节点行为归档(按行 JSON),保留近 2 小时之外的历史记录。
本 Demo 使用文件存储和进程内数据结构以简化实现,若用于生产环境,请替换为可靠的数据库/消息系统,并补充鉴权与高可用能力。