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:
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user