实时追踪异步任务执行状态需实现可观测、可采集、可告警:通过 completablefuture/future 主动查询状态,concurrenthashmap 缓存映射供轮询;用 prometheus 指标(gauge/summary/counter)暴露运行数据;结合 flower、label studio 等生态工具可视化;spring boot actuator + grafana 做看板告警;aop 统一织入状态生命周期管理。

实时追踪异步任务执行状态,关键在于状态可观测、指标可采集、异常可告警。不依赖“猜”或“等日志”,而是让任务从启动、运行到完成(或失败)全程留痕。
用返回值对象主动查状态
最轻量、最直接的方式是让异步方法返回 CompletableFuture 或 Future,调用方持有该对象即可随时检查:
-
isDone()判断是否结束(无论成功或失败) -
isCompletedExceptionally()判断是否异常终止 -
getNow(null)非阻塞获取当前结果(若未完成则返回 null) - 配合
ConcurrentHashMap缓存任务 ID 与 Future 映射,提供/status/{taskId}接口供外部轮询
通过自定义指标暴露运行时数据
把任务执行过程变成 Prometheus 可采集的指标,适合多实例、高并发场景:
- 用
Gauge类型记录任务实时状态(如async_task_status{task_id="1001",type="ocr"}= 1) - 用
Summary统计耗时(async_task_duration_seconds_count和_sum) - 用
Counter累计失败次数(async_task_failures_total{reason="timeout"}) - Spring Boot 中可通过
ThreadPoolTaskExecutor子类重写execute方法,注入指标更新逻辑
借助专用监控工具可视化追踪
对 Celery、GRequests、Label Studio 等框架,优先使用其生态内建的监控方案:
- Celery + Flower:启动
celery -A app flower --port=5555,实时查看队列长度、活跃任务、历史执行详情 - GRequests:为每个
AsyncRequest设置回调函数,在response或exception字段就绪时触发日志/上报 - Label Studio:进入项目 Dashboard,直接查看 Pending / In Progress / Completed 任务分布及平均处理时长
- Spring Boot Actuator + Grafana:暴露
/actuator/metrics,用 Grafana 做看板,设置阈值告警(如任务耗时 >30s)
结合 AOP 统一织入状态生命周期
避免在每个业务方法里重复写监控代码,用切面自动管理状态流转:
- 定义枚举
TaskStatus { CREATED, RUNNING, COMPLETED, FAILED } - 在 @Async 方法执行前后,通过
@Around切面更新数据库或缓存中的任务状态记录 - 异常时捕获
throwable,写入失败原因和堆栈,支持后续人工介入 - 状态变更同时触发消息(如发 Slack / 钉钉通知),实现闭环响应











