ForcePilot/backend/package/yuxi/external_systems/__init__.py
Kris 23a0022d18 feat(external_systems): add graceful resource cleanup on app shutdown
新增外部系统模块的优雅关停逻辑,在应用关闭时释放所有连接池资源和适配器实例缓存,确保httpx、gRPC等连接能够正常发送FIN包完成关闭流程,而非依赖操作系统强制回收文件描述符。
2026-06-25 16:56:19 +08:00

70 lines
2.8 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.

"""外部系统限界上下文重构包。
开发期间根目录为 ``external_systems/``,切换日重命名为 ``external_systems/``。
本包采用轻量六边形架构Ports & Adapters
- ``core/``:数据类 + 端口定义 + 校验函数,不依赖任何外部
- ``use_cases/``:用例编排 + DTO + Mapper + Context 构建,依赖 ``core/``
- ``framework/`` + ``adapters/persistence/``:实现端口,依赖 ``core/`` 端口
详见 ``docs/vibe/v1.1/设计方案/2026-06-17-外部系统六边形架构重构-设计方案-最终版.md``。
"""
from __future__ import annotations
from yuxi.utils import logger
def register_adapters() -> None:
"""显式注册所有外部系统适配器、认证插件与集成包。
由 ``server/utils/lifespan.py`` 在应用启动时调用(切换日后接入)。
调用顺序(蓝本 §12.1 第 8 条):
1. ``discover_adapters()``:扫描 ``framework/adapters/`` 注册协议适配器
2. ``discover_auth_plugins()``:扫描 ``framework/auth_plugins/`` 注册 9 个框架插件
3. ``discover_integration_packages()``:扫描 ``integrations/`` 注册厂商集成包
顺序约束说明adapters 与 auth_plugins 互不依赖可任意顺序integrations 可能
注册渠道专属插件与适配器,放最后。三者均通过子包 ``__init__.py`` 自注册副作用完成。
"""
# 1. 自动发现并注册所有协议适配器
from yuxi.external_systems.framework.registry.discovery import discover_adapters
discover_adapters()
# 2. 自动发现并注册所有认证插件
from yuxi.external_systems.framework.auth_plugins.discovery import discover_auth_plugins
discover_auth_plugins()
# 3. 自动发现并导入所有集成包(由子包 __init__.py 自注册)
from yuxi.external_systems.integrations.discovery import discover_integration_packages
discover_integration_packages()
async def shutdown_external_systems() -> None:
"""应用关闭时释放外部系统模块持有的资源。
与 ``register_adapters`` 对称,由 ``server/utils/lifespan.py`` 在应用关停时调用。
释放顺序:
1. ``pool_manager.close_all()``释放所有连接池句柄httpx/gRPC 等)
2. ``default_registry.aclose_all()``:释放适配器实例缓存资源
任一步失败仅记录日志不中断后续清理best-effort
"""
from yuxi.external_systems.framework.runtime.pool_manager import pool_manager
from yuxi.external_systems.framework.registry.adapter_registry import default_registry
try:
await pool_manager.close_all()
except Exception:
logger.warning("释放外部系统连接池失败", exc_info=True)
try:
await default_registry.aclose_all()
except Exception:
logger.warning("释放外部系统适配器实例失败", exc_info=True)