منطق دورة الحياة
يوفّر AQE سمة واحدة لكل مرحلة من مراحل دورة الحياة:
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: متسامحة افتراضيًا، لأن التنظيف ينبغي أن يستمر حيثما أمكن
التوقيت
Section titled “التوقيت”تستخدم مكونات تغليف دورة الحياة LifecycleTiming لتحديد وقت تشغيلها بالنسبة إلى جسم دالة الاستراتيجية:
LifecycleTiming::BeforeGeneratedLifecycleTiming::AfterGeneratedفي مشاريع AQS المُولَّدة، تعني كلمة «مُولَّد» جسم الدالة الناتج عن الرسم البياني. أما في مشاريع 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()) }}نستخدم ملفات تعريف الارتباط والتخزين الضروريين لتسجيل الدخول وحماية الحساب وحفظ تفضيلات المظهر وهذا الإشعار، ولجمع مقاييس PostHog الداخلية اللازمة لقياس الاستخدام وجودة الجلسات والموثوقية. لا نستخدم ملفات تعريف ارتباط إعلانية.
