ForcePilot/backend/package/yuxi/scheduler/infrastructure/container.py

102 lines
3.7 KiB
Python
Raw Normal View History

"""infrastructure/container.pyscheduler use_cases service 装配容器。
本模块是六边形架构的"唯一装配点"对齐 ``external_systems/infrastructure/container.py``
负责将 persistence 仓储 / runtime 横切关注点装配为 ``SchedulerService``
对外暴露 factory
- ``create_scheduler_service``api 进程请求级 factory``handler_registry=None``
仅支持查询与写操作类用例``trigger_task`` 端点需显式传入 ``arq_pool``
- ``create_worker_scheduler_service``worker 进程请求级 factory传入 worker 进程级
``HandlerRegistry`` ``arq_pool``支持 ``tick`` / ``execute_task`` / ``trigger_task``
全部用例 ``services/scheduler_tick.py`` ARQ 函数在每次调用时创建
边界规范
- 本模块是**唯一允许 import ``SchedulerService`` 实现类**的地方
- ``HandlerRegistry`` ``arq_pool`` 的进程级生命周期由 worker 启动钩子管理
``services/run_worker.py`` ``_worker_startup``factory 仅负责请求级装配
"""
from __future__ import annotations
from typing import TYPE_CHECKING
from sqlalchemy.ext.asyncio import AsyncSession
from yuxi.config.app import config as app_config
from yuxi.scheduler.adapters.persistence import (
SqlAlchemyUnitOfWork,
create_repositories,
)
from yuxi.scheduler.framework.runtime import HandlerRegistry, RuntimeServices
from yuxi.scheduler.use_cases.services.scheduler_service import SchedulerService
if TYPE_CHECKING:
from arq import ArqRedis
__all__ = [
"SchedulerService",
"create_scheduler_service",
"create_worker_scheduler_service",
]
def create_scheduler_service(
db: AsyncSession,
*,
arq_pool: ArqRedis | None = None,
) -> SchedulerService:
"""api 进程请求级工厂:从 db session 创建 ``SchedulerService`` 实例。
封装三层创建逻辑repos + runtime + service对调用方隐藏内部依赖结构
router 在请求开始时调用
Args:
db: SQLAlchemy 异步会话请求级
arq_pool: ARQ 连接池 ``trigger_task`` 端点需要传入
查询 / CRUD / 状态机类端点不传入``None``
Returns:
装配完成的 ``SchedulerService`` 实例``handler_registry=None``
"""
repos = create_repositories(db)
uow = SqlAlchemyUnitOfWork(db)
runtime = RuntimeServices(
handler_registry=None,
arq_pool=arq_pool,
config=app_config,
)
return SchedulerService(repos, runtime, uow)
def create_worker_scheduler_service(
db: AsyncSession,
*,
handler_registry: HandlerRegistry,
arq_pool: ArqRedis,
) -> SchedulerService:
"""worker 进程请求级工厂:创建带完整 runtime 的 ``SchedulerService`` 实例。
``create_scheduler_service`` 的区别传入 worker 进程级 ``HandlerRegistry``
``arq_pool``支持 ``tick`` / ``execute_task`` / ``trigger_task`` 全部用例
``services/scheduler_tick.py`` ARQ 函数在每次调用时创建``HandlerRegistry``
``arq_pool`` 的进程级生命周期由 worker 启动钩子管理
Args:
db: SQLAlchemy 异步会话请求级每次调用新建
handler_registry: worker 进程级 handler 注册表startup 时装配填充
arq_pool: worker 进程级 ARQ 连接池ARQ 注入的 ``ctx['pool']``
Returns:
装配完成的 ``SchedulerService`` 实例持有完整 runtime
"""
repos = create_repositories(db)
uow = SqlAlchemyUnitOfWork(db)
runtime = RuntimeServices(
handler_registry=handler_registry,
arq_pool=arq_pool,
config=app_config,
)
return SchedulerService(repos, runtime, uow)