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

118 lines
6.5 KiB
Python
Raw Normal View History

"""channels 模块的定时任务 handler 注册入口。
本模块是 channels 限界上下文接入 scheduler 限界上下文的唯一登记点
对齐 scheduler 上下文设计方案 §14.3 "业务域 container 主动注册"模式
``infrastructure/channel_use_cases.py`` 同级遵循 channels 的分层约定
装配逻辑集中在 ``infrastructure/``包根不出现装配代码
对外暴露
- ``register_scheduler_handlers(registry)``业务模块注册函数 worker
启动钩子``services/run_worker.py`` ``_worker_startup``统一调用
内部实例化本模块的 handler 并调用 ``registry.register(handler)``
边界规范
- 本模块是 channels 接入 scheduler **唯一装配点**
- handler 的依赖 ``session_factory``在函数内部构造不暴露给装配层
- 新增 handler 在本函数内追加 ``registry.register(...)`` 即可无需改
``run_worker.py``前提本模块已登记在 ``_BUSINESS_HANDLER_REGISTRARS``
- handler 禁止依赖 channels api 进程内存态``PluginRegistry`` /
``DegradationManager`` / ``EventBus`` 只能通过 ``session_factory``
+ DB 查询确保在 worker 进程独立可运行
"""
from __future__ import annotations
from yuxi.channels.application.extension.scheduler_handlers.channel_audit_log_retention_handler import (
ChannelAuditLogRetentionHandler,
)
from yuxi.channels.application.extension.scheduler_handlers.channel_outbox_recovery_handler import (
ChannelOutboxRecoveryHandler,
)
from yuxi.channels.application.extension.scheduler_handlers.channel_outbox_terminal_cleanup_handler import (
ChannelOutboxTerminalCleanupHandler,
)
from yuxi.channels.application.extension.scheduler_handlers.channel_pairing_expiration_handler import (
ChannelPairingExpirationHandler,
)
from yuxi.channels.application.extension.scheduler_handlers.channel_pairing_terminal_cleanup_handler import (
ChannelPairingTerminalCleanupHandler,
)
from yuxi.channels.application.extension.scheduler_handlers.channel_session_inactive_cleanup_handler import (
ChannelSessionInactiveCleanupHandler,
)
from yuxi.channels.infrastructure.channel_use_cases import (
create_channel_audit_log_retention_handler_dependencies,
create_channel_outbox_recovery_handler_dependencies,
create_channel_outbox_terminal_cleanup_handler_dependencies,
create_channel_pairing_expiration_handler_dependencies,
create_channel_pairing_terminal_cleanup_handler_dependencies,
create_channel_session_inactive_cleanup_handler_dependencies,
)
from yuxi.scheduler.framework.runtime import HandlerRegistry
from yuxi.services.run_queue_service import get_arq_pool
from yuxi.storage.postgres.manager import pg_manager
__all__ = ["register_scheduler_handlers"]
async def register_scheduler_handlers(registry: HandlerRegistry) -> None:
"""向 scheduler 注册 channels 模块的定时任务 handler。
worker 启动钩子在装配阶段统一调用新增 handler 时在此函数内追加
``registry.register(...)`` 即可
注册的 handler 分两类
1. **运维型周期清理 handler**FR-04 ~ FR-08 ``schedule_kind="interval"``
周期触发清理超期终态记录与回收卡死任务避免表无限增长worker 进程
不注入 api 进程内存态``EventBus`` / ``PluginRegistry`` 通过
``session_factory`` 创建独立 DB 会话执行清理
2. **业务状态恢复/过期扫描 handler**FR-22 / FR-33 / FR-34替代原
api 进程后台扫描器 scheduler worker 周期触发解决共享
``AsyncSession`` 并发使用与锁 TTL 不匹配问题
Args:
registry: worker 进程级 handler 注册表
"""
session_factory = pg_manager.get_async_session_context
arq_pool = await get_arq_pool()
# ─────────────────────────────────────────────────────────────────────
# P1 运维型周期清理 handlerFR-04 ~ FR-08
# ─────────────────────────────────────────────────────────────────────
# FR-04清理长期 inactive 的临时会话is_temporary=true 且 last_message_at 超时)
session_cleanup_deps = create_channel_session_inactive_cleanup_handler_dependencies(session_factory)
registry.register(ChannelSessionInactiveCleanupHandler(**session_cleanup_deps))
# FR-05物理清理超期 DEAD / SENT 终态 Outbox 条目best-effort 发布
# OutboxEntryPurgedEventevent_publisher=Noneworker 进程未注入)
outbox_cleanup_deps = create_channel_outbox_terminal_cleanup_handler_dependencies(session_factory)
registry.register(ChannelOutboxTerminalCleanupHandler(**outbox_cleanup_deps))
# FR-06物理清理超期终态配对记录EXPIRED / REJECTED / REVOKED
pairing_cleanup_deps = create_channel_pairing_terminal_cleanup_handler_dependencies(session_factory)
registry.register(ChannelPairingTerminalCleanupHandler(**pairing_cleanup_deps))
# ─────────────────────────────────────────────────────────────────────
# FR-22 / FR-33 / FR-34业务恢复/过期扫描 handler
# 由 scheduler worker 触发,替代原 api 进程后台扫描器
# ─────────────────────────────────────────────────────────────────────
# FR-22Outbox 恢复扫描PENDING / SENT_UNCONFIRMED 入队重试 + 死信标记)
outbox_recovery_deps = create_channel_outbox_recovery_handler_dependencies(
session_factory,
arq_pool=arq_pool,
)
registry.register(ChannelOutboxRecoveryHandler(**outbox_recovery_deps))
# FR-33配对过期扫描PENDING → EXPIRED
pairing_expiration_deps = create_channel_pairing_expiration_handler_dependencies(session_factory)
registry.register(ChannelPairingExpirationHandler(**pairing_expiration_deps))
# FR-34审计日志保留期清理
audit_log_retention_deps = create_channel_audit_log_retention_handler_dependencies(session_factory)
registry.register(ChannelAuditLogRetentionHandler(**audit_log_retention_deps))