feat: add scheduled message polling for avatar takeover

Add APScheduler BackgroundScheduler to on_startup that polls
takeover_service.poll_and_process_messages every 10 seconds. Added
redis and apscheduler dependencies. Added poll_and_process_messages,
fetch_unread_messages, and process_message methods to TakeoverService.
Scheduler initialization is graceful — Redis/Box IM failures do not
prevent app startup.
This commit is contained in:
stefanfeng
2026-08-07 17:01:04 +08:00
parent dbd668e451
commit 8e365e63e1
4 changed files with 272 additions and 0 deletions
+45
View File
@@ -2,6 +2,11 @@ from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import os
import logging
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
import redis as redis_lib
from database import init_db, SessionLocal
from models import Avatar, Authorization, Organization, TokenAccount, TokenPlan
@@ -15,6 +20,8 @@ import routers.huihui_auth
import routers.chat
from responses import ok
logger = logging.getLogger(__name__)
app = FastAPI(title="会会数字分身 API", version="1.0.0")
app.add_middleware(
@@ -103,3 +110,41 @@ def seed():
def on_startup():
init_db()
seed()
# --- Takeover scheduler ---
try:
# Initialize Redis (optional)
redis_client = None
redis_url = os.getenv("REDIS_URL", "")
if redis_url:
try:
redis_client = redis_lib.from_url(redis_url)
redis_client.ping()
except Exception as e:
logger.warning(f"Redis connection failed, delayed takeover will degrade to immediate: {e}")
# Initialize Box IM client
from services.boxim_client import BoxIMClient
boxim_config = {
"HUIHUI_IM_BASE_URL": os.getenv("HUIHUI_IM_BASE_URL", "http://192.168.1.200:60040"),
"HUIHUI_APP_ID": os.getenv("HUIHUI_APP_ID", ""),
"HUIHUI_ACCESS_ID": os.getenv("HUIHUI_ACCESS_ID", ""),
"HUIHUI_ACCESS_SECRET": os.getenv("HUIHUI_ACCESS_SECRET", ""),
}
boxim_client = BoxIMClient(boxim_config)
# Initialize takeover service
from services.takeover_service import TakeoverService
takeover_service = TakeoverService(SessionLocal(), boxim_client, redis_client)
# Start periodic polling job
scheduler = BackgroundScheduler()
scheduler.add_job(
takeover_service.poll_and_process_messages,
trigger=IntervalTrigger(seconds=10),
id="takeover_message_poll",
)
scheduler.start()
logger.info("Takeover message polling scheduler started (interval=10s)")
except Exception as e:
logger.warning(f"Failed to initialize takeover scheduler, app will continue without it: {e}")