|
|
@@ -21,6 +21,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
|
from fastapi import FastAPI, HTTPException
|
|
|
from pydantic import BaseModel
|
|
|
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|
|
+from zoneinfo import ZoneInfo
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
load_dotenv()
|
|
|
@@ -50,8 +51,9 @@ app = FastAPI(
|
|
|
description="抖音内容寻找 Agent 服务"
|
|
|
)
|
|
|
|
|
|
-# 定时调度器
|
|
|
-scheduler = AsyncIOScheduler()
|
|
|
+# 定时调度器(默认用中国时区,避免容器 UTC 导致错过预期时间点)
|
|
|
+SCHEDULER_TIMEZONE = os.getenv("SCHEDULER_TIMEZONE", os.getenv("TZ", "Asia/Shanghai"))
|
|
|
+scheduler = AsyncIOScheduler(timezone=ZoneInfo(SCHEDULER_TIMEZONE))
|
|
|
|
|
|
# 并发控制
|
|
|
MAX_CONCURRENT_TASKS = int(os.getenv("MAX_CONCURRENT_TASKS", "1"))
|
|
|
@@ -347,10 +349,20 @@ async def startup():
|
|
|
logger.info("=" * 60)
|
|
|
logger.info("内容寻找服务启动中...")
|
|
|
logger.info(f"最大并发任务数: {MAX_CONCURRENT_TASKS}")
|
|
|
+ logger.info(f"定时器时区: {SCHEDULER_TIMEZONE}")
|
|
|
|
|
|
# 配置定时任务:每天上午 6 点触发一次
|
|
|
- scheduler.add_job(scheduled_task, "cron", hour="22", minute="13")
|
|
|
+ job = scheduler.add_job(
|
|
|
+ scheduled_task,
|
|
|
+ "cron",
|
|
|
+ hour="22",
|
|
|
+ minute="22",
|
|
|
+ second="0",
|
|
|
+ misfire_grace_time=300,
|
|
|
+ coalesce=True,
|
|
|
+ )
|
|
|
scheduler.start()
|
|
|
+ logger.info(f"定时任务已注册: id={job.id}, next_run_time={job.next_run_time}")
|
|
|
# asyncio.create_task(scheduled_task())
|
|
|
# logger.info("定时任务已启动:启动后立即执行一次,之后每 10 分钟执行(从数据库获取待处理需求)")
|
|
|
|