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

102 lines
3.7 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.

"""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)