feat: 新增任务状态管理和API支持

- 添加任务状态API路由,支持获取当前用户的任务状态和待处理任务列表
- 实现任务追踪服务,使用Redis存储任务状态
- 更新回忆录处理逻辑,集成Celery任务提交和状态更新
- 增强测试用例,支持任务状态的获取和清除功能
- 优化代码结构,提升可读性和维护性
This commit is contained in:
penghanyuan
2026-01-21 23:37:00 +01:00
parent 0591e9d7c1
commit 3f899aa16c
6 changed files with 451 additions and 23 deletions

View File

@@ -146,6 +146,30 @@ class BackgroundTaskRunner:
self.analyzer = ContentAnalyzer()
self.generator = MemoirGenerator()
async def _submit_task(self, user_id: str, segment_ids: List[str]) -> str | None:
"""
提交 Celery 任务并记录
Returns:
任务 ID失败返回 None
"""
try:
from tasks.memoir_tasks import process_memoir_segments
from services.task_tracker import task_tracker
# 提交到 Celery
result = process_memoir_segments.delay(user_id, segment_ids)
task_id = result.id
# 记录任务
await task_tracker.add_task(user_id, task_id, "memoir")
logger.info(f"已提交 Celery 任务: user_id={user_id}, task_id={task_id}, segments={len(segment_ids)}")
return task_id
except Exception as e:
logger.error(f"提交 Celery 任务失败: {e}")
return None
async def queue_message(self, user_id: str, segment_id: str) -> None:
"""
将消息加入处理队列
@@ -167,20 +191,20 @@ class BackgroundTaskRunner:
await asyncio.sleep(self.debounce_seconds)
segment_ids = self._pending.pop(user_id, [])
if segment_ids:
# 提交到 Celery
from tasks.memoir_tasks import process_memoir_segments
process_memoir_segments.delay(user_id, segment_ids)
logger.info(f"已提交 Celery 任务: user_id={user_id}, segments={len(segment_ids)}")
await self._submit_task(user_id, segment_ids)
except asyncio.CancelledError:
pass
except Exception as e:
logger.error(f"提交 Celery 任务失败: {e}")
logger.error(f"延迟提交任务失败: {e}")
self._timers[user_id] = asyncio.create_task(delayed_submit())
async def flush_pending(self, user_id: str) -> None:
async def flush_pending(self, user_id: str) -> str | None:
"""
立即提交用户的待处理任务(用于对话结束时)
Returns:
任务 ID无任务或失败返回 None
"""
# 取消定时器
if user_id in self._timers:
@@ -190,6 +214,5 @@ class BackgroundTaskRunner:
# 提交待处理任务
segment_ids = self._pending.pop(user_id, [])
if segment_ids:
from tasks.memoir_tasks import process_memoir_segments
process_memoir_segments.delay(user_id, segment_ids)
logger.info(f"立即提交 Celery 任务: user_id={user_id}, segments={len(segment_ids)}")
return await self._submit_task(user_id, segment_ids)
return None