67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
# ///
|
|
# scheduler_service.py
|
|
# 描述:定时任务调度服务,支持 cron 表达式
|
|
# 作者:AI Generated
|
|
# 创建日期:2026-04-06
|
|
# ///
|
|
|
|
import asyncio
|
|
from typing import Dict, Any
|
|
from croniter import croniter
|
|
from plugins.base import PluginRegistry
|
|
from services.log_service import log_service
|
|
|
|
|
|
class SchedulerService:
|
|
def __init__(self):
|
|
self._running = False
|
|
self._task = None
|
|
self._last_run_times: Dict[str, float] = {}
|
|
|
|
async def start(self):
|
|
if self._running:
|
|
return
|
|
self._running = True
|
|
self._task = asyncio.create_task(self._scheduler_loop())
|
|
log_service.info("调度服务启动", "Scheduler")
|
|
|
|
async def stop(self):
|
|
self._running = False
|
|
if self._task:
|
|
self._task.cancel()
|
|
try:
|
|
await self._task
|
|
except asyncio.CancelledError:
|
|
pass
|
|
log_service.info("调度服务已停止", "Scheduler")
|
|
|
|
async def _scheduler_loop(self):
|
|
while self._running:
|
|
try:
|
|
await self._check_and_run_tasks()
|
|
except Exception as e:
|
|
log_service.error(f"调度循环错误: {e}", "Scheduler")
|
|
await asyncio.sleep(10)
|
|
|
|
async def _check_and_run_tasks(self):
|
|
tasks = PluginRegistry.get_scheduled_tasks()
|
|
import time
|
|
current_time = time.time()
|
|
|
|
for task in tasks:
|
|
try:
|
|
should_run, next_run = task.should_run_and_get_next()
|
|
if should_run:
|
|
log_service.info(f"执行定时任务: {task.plugin_name}", "Scheduler")
|
|
result = task.run_task()
|
|
if result.get("success"):
|
|
log_service.success(f"定时任务完成: {task.plugin_name}", "Scheduler")
|
|
else:
|
|
log_service.error(f"定时任务失败: {task.plugin_name} - {result.get('error')}", "Scheduler")
|
|
self._last_run_times[task.plugin_name] = current_time
|
|
except Exception as e:
|
|
log_service.error(f"执行定时任务 {task.plugin_name} 出错: {e}", "Scheduler")
|
|
|
|
|
|
scheduler_service = SchedulerService()
|