التعامل مع التعليق والاستئناف

يمكن تعليق الأجهزة الافتراضية وإعادة تشغيلها وإعادة إقلاعها وإيقافها. عند حدوث أي من هذه الأحداث، يتأثر الناشرون والمشتركون والبرامج العميلة لاستدعاء إجراء عن بُعد (RPC) وخوادم استدعاء إجراء عن بُعد (RPC). يوضّح الشكل 1 دورة حياة حزمة الخدمات:

مراحل حزمة الخدمات

الشكل 1: دورة حياة حزمة الخدمات

تتّبع دورة حياة حزمة الخدمات التسلسل التالي:

  1. يتم استدعاء طريقة new لإنشاء حزمة الخدمات.
  2. يبدأ مدير دورة الحياة حزمة الخدمات، ويستدعي on_start استنادًا إلى الإعدادات في إعدادات التنسيق.
  3. عندما يتوقف الجهاز الافتراضي أو يتم تعليقه، يستدعي مدير دورة الحياة on_stop استنادًا إلى الإعدادات في إعدادات التنسيق. يجب أن توقف الدالة on_stop سلاسل المحادثات للناشرين والمشتركين والبرامج العميلة لاستدعاء إجراء عن بُعد (RPC) وخوادم استدعاء إجراء عن بُعد (RPC).
  4. عند استئناف الجهاز الافتراضي، يمكن أن تعيد الدالة on_start إنشاء سلاسل المحادثات إذا تم ضبط حزمة الخدمات ليتم تشغيلها مرة أخرى من خلال إعدادات التنسيق.

إنشاء إعداد للتعامل مع التعليق والاستئناف

يعرض المثال التالي إعدادًا للتعامل مع التعليق والاستئناف:

# Start `auto_start` service bundles when system is started.
state {
    condition {
        or {
            power_state: "ON"
            power_state: "POWER_OFF_EXIT"
            power_state: "SUSPEND_TO_RAM_EXIT"
        }
    }
    groups_states { started: "auto_start" }
}

# Stop `auto_start` service bundles when system is suspending to RAM.
state {
    condition {
        or {
            power_state: "SUSPEND_TO_RAM_ENTER"
            power_state: "WAIT_FOR_FINISH"
            power_state: "SUSPEND_TO_RAM_POST_FINISH"
        }
    }
    groups_states { created: "auto_start" }
}

المكان:

  • WAIT_FOR_FINISH هي حالة الطاقة الأخيرة التي يجب أن تتوقع فيها حزمة الخدمات أن تستجيب لها برامج وكيل المركبات المعرّفة بالبرامج (SDV).
  • يشير SUSPEND_TO_RAM_POST_FINISH إلى أنّ وكلاء SDV قد يغلقون الاتصال أو يعلّقونه ليتمكّنوا من استعادته بشكل موثوق عند الاستئناف. من المهم عدم الاعتماد على SUSPEND_TO_RAM_POST_FINISH أو POWER_OFF_POST_FINISH لاستدعاء onStop في عملية تنفيذ حزمة الخدمات، والاعتماد بدلاً من ذلك على SUSPEND_TO_RAM_ENTER وPOWER_OFF_ENTER وWAIT_FOR_FINISH.

تحديد مدى توفّر الخدمة

يوضّح المثال التالي كيفية استخدام واجهة برمجة تطبيقات البرامج الوسيطة في حزمة الخدمات لتحديد ما إذا كانت وحدة الخدمة متاحة:

let mut registration_event_stream =  sdv::mw::clientlib::create_server_registration_event_stream(
        sdv_comms,
        // Descriptor of type sdv::mw::clientlib::rpc_descriptor::client::Descriptor
        // that binds a specific RPC client type to a communication channel.
        client_descriptor,
    )
    .await
    .expect("unable to generate a registration event");

match registration_event_stream.next().await {
            Some(sdv::mw::Availability::Available) => {
                info!("{unit_name} became Available.");
                // Create client/subscriber
            }
            Some(sdv::mw::Availability::Unavailable) => {
                info!("{unit_name} became Unavailable.");
                // Destroy client/subscriber
            }
            None => {
                warn!("Registration event stream for {unit_name} terminated.
                Stopping monitoring for this variant.");
            }
        }

create_server_registration_event_stream هي واجهة برمجة تطبيقات للبرامج الوسيطة تُستخدم لإنشاء حدث يُسمى unit_name. يتم إشعار مصدر حدث التسجيل هذا عندما تصبح وحدة الخدمة متاحة.