VWED_server/app.py

104 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# app.py
from fastapi import FastAPI, Request
import uvicorn
import os
from contextlib import asynccontextmanager
# 导入配置
from config.settings import settings
# 导入数据库相关
from data.session import init_database, close_database_connections, close_async_database_connections
# 导入路由注册函数
from routes import register_routers
# 导入中间件注册函数
from middlewares import register_middlewares
# 导入日志工具
from utils.logger import get_logger
# 设置日志
logger = get_logger("app")
@asynccontextmanager
async def lifespan(app: FastAPI):
"""
应用程序生命周期管理
启动时初始化数据库和任务调度器,关闭时清理资源
"""
# 启动前的初始化操作
# 初始化数据库
init_database()
# 启动增强版任务调度器
from services.enhanced_scheduler import scheduler
await scheduler.start(worker_count=settings.TASK_SCHEDULER_MIN_WORKER_COUNT)
logger.info(f"增强版任务调度器已启动,最小工作线程数: {settings.TASK_SCHEDULER_MIN_WORKER_COUNT},最大工作线程数: {settings.TASK_SCHEDULER_MAX_WORKER_COUNT}")
# 启动库区锁清理任务
from utils.area_lock_manager import start_lock_cleanup_task
await start_lock_cleanup_task()
logger.info("库区锁管理器已初始化")
# 启动设备处理服务和MQTT服务
try:
from services.online_script.device_handler_service import get_device_service
device_service = get_device_service()
await device_service.start_service()
logger.info("设备处理服务已启动")
except Exception as e:
logger.error(f"启动设备处理服务失败: {e}", exc_info=True)
# 即使MQTT服务启动失败也不中断应用启动
logger.warning("设备处理服务启动失败,但应用将继续运行")
yield
# 应用程序关闭前的清理操作
logger.info("应用程序关闭中...")
# 停止设备处理服务
try:
from services.online_script.device_handler_service import get_device_service
device_service = get_device_service()
await device_service.stop_service()
logger.info("设备处理服务已停止")
except Exception as e:
logger.error(f"停止设备处理服务失败: {e}", exc_info=True)
# 停止增强版任务调度器
from services.enhanced_scheduler import scheduler
await scheduler.stop()
logger.info("增强版任务调度器已停止")
await close_async_database_connections() # 关闭异步数据库连接
close_database_connections() # 关闭同步数据库连接
# 创建FastAPI应用
app = FastAPI(
title=settings.APP_NAME,
description=settings.APP_DESCRIPTION,
version=settings.APP_VERSION,
lifespan=lifespan,
debug=settings.DEBUG
)
# 注册中间件
register_middlewares(app)
# 注册所有路由
register_routers(app)
# 主函数
if __name__ == "__main__":
# 从环境变量中获取端口默认为8000
import time
# start_time = time.time()
# port = int(os.environ.get("PORT", settings.SERVER_PORT))
port = 8000
# 打印启动配置信息
logger.info(f"服务器配置 - Host: 0.0.0.0, Port: {port}, Workers: {settings.SERVER_WORKERS}, Reload: {settings.SERVER_RELOAD}")
end_time = time.time()
# 启动服务器
uvicorn.run(
"app:app",
host="0.0.0.0",
port=port,
reload=settings.SERVER_RELOAD, # 使用SERVER_RELOAD而不是DEBUG
workers=settings.SERVER_WORKERS
)