Skip to main content

initializer

Attribute Macro initializer 

Source
#[initializer]
Expand description

业务作用:把完整 Initialization trait impl 登记为业务二进制内的静态 initializer, 并与 Service 启动 Hook 动态登记的 initializer 合并成同一份冻结计划。

本属性只能标注安全、正向、无 impl 泛型参数的 Initialization trait impl,不能标注单个方法、 固有 impl、unsafe impl 或其它 trait。被登记的实例会严格参与三轮全局屏障:全部 before 完成后 才进入全部 initialize,全部 initialize 完成后才进入全部 after。

§执行阶段

Service 模式的时序为:业务 UserHook 完成登记并冻结 initializer 计划,组件完成 Prepare (包括 migration 和出站依赖门禁),然后调用条件工厂并执行三轮 initializer 屏障。只有全部成功后, Runner 才进入 Seal、组件 Ready、staged task 激活和 mark_ready();因此 initializer 执行期间 Web/WS listener、consumer 和服务发现尚未对外接流。

Batch 模式只收集静态 one-shot initializer,在组件 Prepare 之后、业务工作负载被 poll 之前 执行条件工厂和三轮屏障;hosted initializer 会被拒绝,Batch 工作负载中也不能动态补登记 initializer。hosted initializer 暂存的长期任务只在 Service 的组件 Ready 全部成功后交给 Supervisor,任务主体还会继续等待 mark_ready(),不会与初始化阶段并发执行。

§属性

  • name = "...":可选。应用内唯一的 canonical 身份,只允许 ASCII 小写字母、数字、_、-、., 长度为 1..=128 字节。省略时从 impl 的实现类型名派生 kebab-case,例如 OrderCacheInitialization 派生为 order-cache-initialization;无法稳定派生时必须显式声明。 派生结果仍是依赖名、日志字段和指标 label 使用的稳定业务身份,重命名实现类型会同步改变该身份; 需要跨发布保持依赖引用和观测连续性时必须显式填写 name。
  • order = ...:可选 i32 整数字面量,默认 100000。依赖条件相同且当前都可执行时,数值越小 越先执行;数值相同按 name 升序消除平局。requires 依赖边始终优先于 order,低 order 不能越过尚未完成的依赖。
  • requires = ["..."]:可选,默认空。声明本项执行前必须成功启用并完成同阶段调用的 initializer, 最多 32 项;缺失、重复、自依赖或依赖环都会拒绝启动。
  • kind = "one-shot" | "hosted":可选,默认 "one-shot"。hosted 只允许 Service 模式, 并可在 after 暂存 Ready 后启动的长期任务或 readiness;one-shot 只执行有界初始化。
  • factory = path:可选异步条件工厂。签名必须为 async fn(Application) -> ApplicationResult<Option<T>>;Some(T) 启用本项,None 表示条件未命中, Err 阻止应用接流。省略时实现类型必须实现 Default。

§示例

ⓘ
#[derive(Default)]
struct OrderCacheInitialization;

#[nasa::initializer(order = 200, requires = ["schema"])]
impl nasa::application::Initialization for OrderCacheInitialization {
    // 实现 before / initialize / after 中实际需要的阶段。
}

参数说明:

  • attr:name/order/requires/kind/factory 元数据。
  • item:无 impl 泛型参数的安全、正向 Initialization trait impl。

返回:原 trait impl、类型擦除工厂和 linkme 静态描述;合同非法时返回定位到属性或 impl 的编译错误。