تخطَّ إلى المحتوى

منطق دورة الحياة

يوفّر AQE سمة واحدة لكل مرحلة من مراحل دورة الحياة:

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 المُولَّدة، تعني كلمة «مُولَّد» جسم الدالة الناتج عن الرسم البياني. أما في مشاريع 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(),
);

مثال لمكوّن بدء التشغيل

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())
}
}