跳转至

Event / EventDeclaration / EventRegistry 文档

概述

事件系统是 EventBus 的类型基础。EventDeclaration 声明事件元数据,Event 是运行时实例,EventRegistry 集中管理所有合法事件类型。


Event

运行时事件实例,由总线在发布时自动创建。

class Event(BaseModel):
    name: str                           # 事件类型名
    data: Optional[BaseModel] = None    # 负载数据(Pydantic 模型实例)
    id: str                             # 事件 UUID(自动生成)
    sources: List[str]                  # 处理链来源记录
    timestamps: List[datetime]          # 各环节时间戳
    event_ids: List[str]                # 事件链 UUID
字段 类型 说明
name str 事件类型名称,对应 EventDeclaration.name。
data Optional[BaseModel] 发布时传入的负载数据。无负载事件为 None。
id str 事件唯一标识(UUID hex),自动生成。
sources List[str] 事件经过的处理节点名称列表,用于追踪处理链。
timestamps List[datetime] 每个处理节点的时间戳列表,与 sources 一一对应。
event_ids List[str] 事件链中所有事件的列表(包括自己),用于追踪因果。

EventDeclaration

事件声明的抽象基类。所有自定义事件类型必须继承此类。

class EventDeclaration(ABC):
    name: ClassVar[str]                              # 事件名称(必须为非空字符串)
    payload_type: ClassVar[Optional[Type[BaseModel]]] = None  # 负载模型类(可选)
类变量 类型 说明
name ClassVar[str] 必需。事件类型的唯一标识名,不能为空字符串或纯空格。
payload_type ClassVar[Optional[Type[BaseModel]]] 负载数据的 Pydantic 模型类。None 表示该事件无负载。

子类化时自动校验 name 非空,违反则抛出 TypeError。

使用示例

from pydantic import BaseModel
from infinity_bus import EventDeclaration

class UserLoginPayload(BaseModel):
    user_id: str
    timestamp: datetime

class UserLoginEvent(EventDeclaration):
    name = "user.login"
    payload_type = UserLoginPayload

# 无负载事件
class HeartbeatEvent(EventDeclaration):
    name = "system.heartbeat"
    # payload_type 默认为 None

EventRegistry

事件注册表,管理所有合法的事件声明。发布时用于校验事件类型和负载。

class EventRegistry:
    def __init__(self) -> None
    def register(self, event_decl: Type[EventDeclaration]) -> None
    def unregister(self, event_name: str) -> None
    def get(self, name: str) -> Optional[Type[EventDeclaration]]
    def list_names(self) -> List[str]

    @property
    def version(self) -> int
方法 / 属性 说明
register(event_decl) 注册一个事件声明类。若同名已存在则抛出 ValueError。
unregister(event_name) 注销指定名称的事件声明(不存在则静默忽略)。
get(name) 按名称查找事件声明,不存在返回 None。
list_names() 返回所有已注册事件名称的列表。
version 注册表版本号,每次增删递增,供 Router 感知变化。

使用示例

registry = EventRegistry()
registry.register(UserLoginEvent)
registry.register(HeartbeatEvent)

assert registry.get("user.login") is UserLoginEvent
assert registry.get("unknown.event") is None
print(registry.list_names())  # ["user.login", "system.heartbeat"]