本次提交完成了定时任务调度限界上下文的全量基础架构搭建,包括: 1. 基于六边形架构的完整分层(core/use_cases/framework/adapters/infrastructure) 2. 任务调度核心领域模型、端口契约与校验工具 3. 持久化适配器层与SQLAlchemy仓储实现 4. 调度运行时核心组件(handler注册表、执行引擎) 5. 内置维护型任务handler(日志清理、幂等记录清理) 6. 全局异常处理器与PostgreSQL表结构适配 7. ARQ worker调度任务集成与启动装配逻辑
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)
|