生命周期逻辑
AQE 为每个生命周期阶段提供一个 trait:
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::BeforeGeneratedLifecycleTiming::AfterGenerated在 AQS 生成的项目中,generated 指根据节点图生成的方法体;在手写 AQE 项目中,它指你在 Strategy 实现中编写的内联方法体。
验证、环境配置、初始状态设置等准备工作,如果是策略方法体的前置依赖,应使用 BeforeGenerated。后续处理、注册检查,以及必须等策略方法体执行后才能生成的元数据,应使用 AfterGenerated。
注册生命周期逻辑
Section titled “注册生命周期逻辑”直接使用 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(),);启动组件示例
Section titled “启动组件示例”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()) }}