102 lines
3.7 KiB
Python
102 lines
3.7 KiB
Python
|
|
"""infrastructure/container.py:scheduler 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)
|