跳转到内容

生命周期逻辑

AQE 为每个生命周期阶段提供一个 trait:

aq-engine/src/core/lifecycle/mod.rs
pub trait OnStartLogic {
fn version(&self) -> &str;
fn run(&mut self, ctx: &mut dyn StrategyContext) -> LifecycleResult;
}
pub trait OnInitLogic {
fn version(&self) -> &str;
fn run(&mut self, ctx: &mut dyn StrategyContext, asset: &Asset) -> LifecycleResult;
}
pub trait OnTeardownLogic {
fn version(&self) -> &str;
fn run(&mut self, ctx: &mut dyn StrategyContext) -> LifecycleResult;
}

每个 run 方法都返回 LifecycleResult,记录执行是否成功、可选消息和组件元数据。如果组件配置为 can_fail(false),失败时会停止运行;配置为 can_fail(true) 时,则只记录失败信息,并继续运行。

默认失败策略:

  • OnStartLogic:默认严格处理
  • OnInitLogic:默认严格处理
  • OnTeardownLogic:默认容错,因为清理工作应尽可能继续

生命周期包装器使用 LifecycleTiming,选择在策略方法体之前还是之后运行:

LifecycleTiming::BeforeGenerated
LifecycleTiming::AfterGenerated

在 AQS 生成的项目中,generated 指根据节点图生成的方法体;在手写 AQE 项目中,它指你在 Strategy 实现中编写的内联方法体。

验证、环境配置、初始状态设置等准备工作,如果是策略方法体的前置依赖,应使用 BeforeGenerated。后续处理、注册检查,以及必须等策略方法体执行后才能生成的元数据,应使用 AfterGenerated。

直接使用 AQE 的项目在开始运行前,将生命周期逻辑注册到 StrategyState。引擎会自动调用这些组件;用户策略代码不应手动调用生命周期运行辅助方法。

state.add_on_start_logic(
OnStartLogicBuilder::new(Box::new(SeedRuntimeState::new()))
.timing(LifecycleTiming::BeforeGenerated)
.can_fail(false)
.build(),
);
state.add_on_init_logic(
OnInitLogicBuilder::new(Box::new(InitAssetState::new()))
.timing(LifecycleTiming::AfterGenerated)
.can_fail(false)
.build(),
);
state.add_on_teardown_logic(
OnTeardownLogicBuilder::new(Box::new(FlushRuntimeLogs::new()))
.timing(LifecycleTiming::AfterGenerated)
.can_fail(true)
.build(),
);
use aq_engine::core::lifecycle::{LifecycleResult, OnStartLogic};
use aq_engine::core::strategy::StrategyContext;
use serde_json::json;
pub struct SeedRuntimeState;
impl SeedRuntimeState {
pub fn new() -> Self {
Self
}
}
impl OnStartLogic for SeedRuntimeState {
fn version(&self) -> &str {
"1.0"
}
fn run(&mut self, ctx: &mut dyn StrategyContext) -> LifecycleResult {
ctx.variables().insert(
self.name().to_string(),
json!({
"started": true,
"symbols_seen": 0
}),
);
LifecycleResult::passed(self.name().to_string())
}
}