2025-04-30 16:57:46 +08:00
|
|
|
|
# app.py
|
2025-07-14 10:29:37 +08:00
|
|
|
|
from fastapi import FastAPI, Request
|
2025-04-30 16:57:46 +08:00
|
|
|
|
import uvicorn
|
|
|
|
|
import os
|
2025-07-14 10:29:37 +08:00
|
|
|
|
from contextlib import asynccontextmanager
|
|
|
|
|
|
2025-04-30 16:57:46 +08:00
|
|
|
|
# 导入配置
|
|
|
|
|
from config.settings import settings
|
|
|
|
|
# 导入数据库相关
|
|
|
|
|
from data.session import init_database, close_database_connections, close_async_database_connections
|
2025-07-14 10:29:37 +08:00
|
|
|
|
# 导入路由注册函数
|
|
|
|
|
from routes import register_routers
|
|
|
|
|
# 导入中间件注册函数
|
|
|
|
|
from middlewares import register_middlewares
|
|
|
|
|
# 导入日志工具
|
|
|
|
|
from utils.logger import get_logger
|
|
|
|
|
|
2025-04-30 16:57:46 +08:00
|
|
|
|
# 设置日志
|
|
|
|
|
logger = get_logger("app")
|
|
|
|
|
|
|
|
|
|
@asynccontextmanager
|
|
|
|
|
async def lifespan(app: FastAPI):
|
|
|
|
|
"""
|
|
|
|
|
应用程序生命周期管理
|
|
|
|
|
启动时初始化数据库和任务调度器,关闭时清理资源
|
|
|
|
|
"""
|
|
|
|
|
# 启动前的初始化操作
|
|
|
|
|
# 初始化数据库
|
2025-07-16 10:50:00 +08:00
|
|
|
|
init_database()
|
2025-04-30 16:57:46 +08:00
|
|
|
|
# 启动增强版任务调度器
|
|
|
|
|
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}")
|
|
|
|
|
|
2025-09-09 10:41:27 +08:00
|
|
|
|
# 启动库区锁清理任务
|
|
|
|
|
from utils.area_lock_manager import start_lock_cleanup_task
|
|
|
|
|
await start_lock_cleanup_task()
|
|
|
|
|
logger.info("库区锁管理器已初始化")
|
|
|
|
|
|
2025-09-20 16:50:45 +08:00
|
|
|
|
# 启动设备处理服务和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("设备处理服务启动失败,但应用将继续运行")
|
|
|
|
|
|
2025-04-30 16:57:46 +08:00
|
|
|
|
yield
|
|
|
|
|
|
|
|
|
|
# 应用程序关闭前的清理操作
|
|
|
|
|
logger.info("应用程序关闭中...")
|
|
|
|
|
|
2025-09-20 16:50:45 +08:00
|
|
|
|
# 停止设备处理服务
|
|
|
|
|
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)
|
|
|
|
|
|
2025-04-30 16:57:46 +08:00
|
|
|
|
# 停止增强版任务调度器
|
|
|
|
|
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
|
|
|
|
|
)
|
2025-07-14 10:29:37 +08:00
|
|
|
|
# 注册中间件
|
|
|
|
|
register_middlewares(app)
|
|
|
|
|
# 注册所有路由
|
|
|
|
|
register_routers(app)
|
2025-04-30 16:57:46 +08:00
|
|
|
|
|
|
|
|
|
# 主函数
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
# 从环境变量中获取端口,默认为8000
|
2025-07-16 10:50:00 +08:00
|
|
|
|
import time
|
|
|
|
|
# start_time = time.time()
|
2025-08-13 15:27:04 +08:00
|
|
|
|
# port = int(os.environ.get("PORT", settings.SERVER_PORT))
|
2025-09-09 10:41:27 +08:00
|
|
|
|
port = 8000
|
2025-07-14 10:29:37 +08:00
|
|
|
|
# 打印启动配置信息
|
|
|
|
|
logger.info(f"服务器配置 - Host: 0.0.0.0, Port: {port}, Workers: {settings.SERVER_WORKERS}, Reload: {settings.SERVER_RELOAD}")
|
2025-07-16 10:50:00 +08:00
|
|
|
|
end_time = time.time()
|
2025-04-30 16:57:46 +08:00
|
|
|
|
# 启动服务器
|
|
|
|
|
uvicorn.run(
|
|
|
|
|
"app:app",
|
|
|
|
|
host="0.0.0.0",
|
|
|
|
|
port=port,
|
2025-07-14 10:29:37 +08:00
|
|
|
|
reload=settings.SERVER_RELOAD, # 使用SERVER_RELOAD而不是DEBUG
|
2025-04-30 16:57:46 +08:00
|
|
|
|
workers=settings.SERVER_WORKERS
|
|
|
|
|
)
|