mirror of
https://github.com/rachelos/we-mp-rss.git
synced 2026-08-30 18:01:55 +08:00
146 lines
4.7 KiB
Python
146 lines
4.7 KiB
Python
"""任务队列管理API"""
|
|
from fastapi import APIRouter, Depends, Query
|
|
from typing import Optional
|
|
from core.auth import get_current_user_or_ak
|
|
from core.queue.queue import TaskQueue
|
|
from core.task.task import TaskScheduler
|
|
from .base import success_response, error_response
|
|
from core.log import logger
|
|
|
|
router = APIRouter(prefix="/task-queue", tags=["任务队列"])
|
|
|
|
@router.get("/status", summary="获取任务队列状态")
|
|
async def get_queue_status(
|
|
current_user: dict = Depends(get_current_user_or_ak)
|
|
):
|
|
"""
|
|
获取任务队列的详细状态信息
|
|
|
|
返回:
|
|
- tag: 队列标签
|
|
- is_running: 是否运行中
|
|
- pending_count: 待执行任务数
|
|
- pending_tasks: 待执行任务列表
|
|
- current_task: 当前执行的任务
|
|
- history_count: 历史记录总数
|
|
- recent_history: 最近执行记录
|
|
"""
|
|
try:
|
|
status = TaskQueue.get_detailed_status()
|
|
logger.info(f"Queue status: {status}")
|
|
return success_response(data=status)
|
|
except Exception as e:
|
|
logger.error(f"Get queue status error: {str(e)}")
|
|
return error_response(code=500, message=str(e))
|
|
|
|
@router.get("/history", summary="获取任务执行历史")
|
|
async def get_queue_history(
|
|
limit: int = Query(20, ge=1, le=100, description="返回记录数量"),
|
|
current_user: dict = Depends(get_current_user_or_ak)
|
|
):
|
|
"""
|
|
获取任务执行历史记录
|
|
|
|
参数:
|
|
limit: 返回记录数量,默认20条
|
|
"""
|
|
try:
|
|
status = TaskQueue.get_detailed_status()
|
|
history = status.get('recent_history', [])[:limit]
|
|
return success_response(data={
|
|
'history': history,
|
|
'total': status.get('history_count', 0)
|
|
})
|
|
except Exception as e:
|
|
return error_response(code=500, message=str(e))
|
|
|
|
@router.post("/clear", summary="清空任务队列")
|
|
async def clear_queue(
|
|
current_user: dict = Depends(get_current_user_or_ak)
|
|
):
|
|
"""
|
|
清空任务队列中的所有待执行任务
|
|
|
|
注意: 正在执行的任务不会被中断
|
|
"""
|
|
try:
|
|
TaskQueue.clear_queue()
|
|
return success_response(message="队列已清空")
|
|
except Exception as e:
|
|
return error_response(code=500, message=str(e))
|
|
|
|
@router.post("/history/clear", summary="清空任务历史")
|
|
async def clear_history(
|
|
current_user: dict = Depends(get_current_user_or_ak)
|
|
):
|
|
"""
|
|
清空任务执行历史记录
|
|
"""
|
|
try:
|
|
TaskQueue.clear_history()
|
|
return success_response(message="任务历史已清空")
|
|
except Exception as e:
|
|
return error_response(code=500, message=str(e))
|
|
|
|
@router.get("/scheduler/status", summary="获取调度器状态")
|
|
async def get_scheduler_status(
|
|
current_user: dict = Depends(get_current_user_or_ak)
|
|
):
|
|
"""
|
|
获取定时任务调度器的状态信息
|
|
|
|
返回:
|
|
- running: 调度器是否运行中
|
|
- job_count: 定时任务数量
|
|
- next_run_times: 各任务下次执行时间
|
|
"""
|
|
try:
|
|
# 从 jobs.mps 导入调度器实例
|
|
from jobs.mps import scheduler
|
|
status = scheduler.get_scheduler_status()
|
|
logger.info(f"Scheduler status: {status}")
|
|
return success_response(data=status)
|
|
except ImportError as e:
|
|
logger.error(f"Import scheduler error: {str(e)}")
|
|
return success_response(data={
|
|
'running': False,
|
|
'job_count': 0,
|
|
'next_run_times': []
|
|
})
|
|
except Exception as e:
|
|
logger.error(f"Get scheduler status error: {str(e)}")
|
|
return error_response(code=500, message=str(e))
|
|
|
|
@router.get("/scheduler/jobs", summary="获取定时任务列表")
|
|
async def get_scheduler_jobs(
|
|
current_user: dict = Depends(get_current_user_or_ak)
|
|
):
|
|
"""
|
|
获取所有定时任务的详细信息
|
|
"""
|
|
try:
|
|
from jobs.mps import scheduler
|
|
job_ids = scheduler.get_job_ids()
|
|
jobs = []
|
|
for job_id in job_ids:
|
|
try:
|
|
details = scheduler.get_job_details(job_id)
|
|
jobs.append(details)
|
|
except Exception as job_error:
|
|
logger.warning(f"Get job {job_id} details error: {str(job_error)}")
|
|
jobs.append({'id': job_id, 'error': '获取详情失败'})
|
|
logger.info(f"Scheduler jobs: {len(jobs)} jobs")
|
|
return success_response(data={
|
|
'jobs': jobs,
|
|
'total': len(jobs)
|
|
})
|
|
except ImportError as e:
|
|
logger.error(f"Import scheduler error: {str(e)}")
|
|
return success_response(data={
|
|
'jobs': [],
|
|
'total': 0
|
|
})
|
|
except Exception as e:
|
|
logger.error(f"Get scheduler jobs error: {str(e)}")
|
|
return error_response(code=500, message=str(e))
|