fix: await takeover polling jobs
This commit is contained in:
@@ -4,7 +4,7 @@ from fastapi.middleware.cors import CORSMiddleware
|
||||
import os
|
||||
import logging
|
||||
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
from apscheduler.triggers.interval import IntervalTrigger
|
||||
import redis as redis_lib
|
||||
|
||||
@@ -23,6 +23,9 @@ from responses import ok
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
takeover_scheduler = None
|
||||
takeover_db = None
|
||||
|
||||
app = FastAPI(title="会会数字分身 API", version="1.0.0")
|
||||
|
||||
app.add_middleware(
|
||||
@@ -110,9 +113,14 @@ def seed():
|
||||
|
||||
@app.on_event("startup")
|
||||
def on_startup():
|
||||
global takeover_scheduler, takeover_db
|
||||
|
||||
init_db()
|
||||
seed()
|
||||
|
||||
# Release stale resources when startup is invoked again by a reload/test.
|
||||
stop_takeover_scheduler()
|
||||
|
||||
# --- Takeover scheduler ---
|
||||
try:
|
||||
# Initialize Redis (optional)
|
||||
@@ -137,16 +145,42 @@ def on_startup():
|
||||
|
||||
# Initialize takeover service
|
||||
from services.takeover_service import TakeoverService
|
||||
takeover_service = TakeoverService(SessionLocal(), boxim_client, redis_client)
|
||||
takeover_db = SessionLocal()
|
||||
takeover_service = TakeoverService(takeover_db, boxim_client, redis_client)
|
||||
|
||||
# Start periodic polling job
|
||||
scheduler = BackgroundScheduler()
|
||||
scheduler.add_job(
|
||||
# AsyncIOScheduler awaits the service coroutine instead of dropping it.
|
||||
takeover_scheduler = AsyncIOScheduler()
|
||||
takeover_scheduler.add_job(
|
||||
takeover_service.poll_and_process_messages,
|
||||
trigger=IntervalTrigger(seconds=10),
|
||||
id="takeover_message_poll",
|
||||
)
|
||||
scheduler.start()
|
||||
takeover_scheduler.start()
|
||||
logger.info("Takeover message polling scheduler started (interval=10s)")
|
||||
except Exception as e:
|
||||
stop_takeover_scheduler()
|
||||
logger.warning(f"Failed to initialize takeover scheduler, app will continue without it: {e}")
|
||||
|
||||
|
||||
def stop_takeover_scheduler():
|
||||
global takeover_scheduler, takeover_db
|
||||
|
||||
if takeover_scheduler is not None:
|
||||
try:
|
||||
if takeover_scheduler.running:
|
||||
takeover_scheduler.shutdown(wait=False)
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to stop takeover scheduler cleanly: {e}")
|
||||
finally:
|
||||
takeover_scheduler = None
|
||||
|
||||
if takeover_db is not None:
|
||||
try:
|
||||
takeover_db.close()
|
||||
finally:
|
||||
takeover_db = None
|
||||
|
||||
|
||||
@app.on_event("shutdown")
|
||||
def on_shutdown():
|
||||
stop_takeover_scheduler()
|
||||
|
||||
Reference in New Issue
Block a user