हैंडल को निलंबित करना और उसे वापस लाना

वर्चुअल मशीन (VMs) को रोका, फिर से शुरू, रीबूट, और बंद किया जा सकता है. इनमें से कोई भी इवेंट होने पर, पब्लिशर, सदस्य, RPC क्लाइंट, और RPC सर्वर पर असर पड़ता है. पहली इमेज में, सेवा बंडल की लाइफ़साइकल दिखाई गई है:

सेवा के बंडल का लाइफ़साइकल

पहली इमेज. सेवा बंडल की लाइफ़साइकल.

सेवा बंडल की लाइफ़साइकल इस क्रम में होती है:

  1. सेवा बंडल बनाने के लिए, new तरीके को कॉल किया जाता है.
  2. लाइफ़साइकल मैनेजर, सेवा बंडल शुरू करता है. साथ ही, ऑर्केस्ट्रेशन कॉन्फ़िगरेशन में मौजूद सेटिंग के आधार पर, on_start को कॉल करता है.
  3. जब VM बंद होता है या उसे रोका जाता है, तब ऑर्केस्ट्रेशन कॉन्फ़िगरेशन में मौजूद सेटिंग के आधार पर, लाइफ़साइकल मैनेजर on_stop को कॉल करता है. on_stop फ़ंक्शन को पब्लिशर, सदस्य, RPC क्लाइंट, और RPC सर्वर के थ्रेड बंद करने चाहिए.
  4. जब VM को फिर से शुरू किया जाता है, तब 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 वह आखिरी पावर स्टेट है जिसमें सेवा बंडल को सॉफ़्टवेयर से तय होने वाली गाड़ी (एसडीवी) के एजेंट से जवाब मिलने की उम्मीद करनी चाहिए.
  • SUSPEND_TO_RAM_POST_FINISH से पता चलता है कि एसडीवी एजेंट, कनेक्शन बंद या रोक सकते हैं, ताकि उन्हें फिर से शुरू करने पर भरोसेमंद तरीके से रीस्टोर किया जा सके. सेवा बंडल के लागू होने में onStop को कॉल करने के लिए, SUSPEND_TO_RAM_POST_FINISH या POWER_OFF_POST_FINISH पर भरोसा न करना ज़रूरी है. इसके बजाय, 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 नाम का इवेंट बनाने के लिए किया जाता है. जब कोई सेवा यूनिट उपलब्ध होती है, तो इस रजिस्ट्रेशन इवेंट स्ट्रीम को सूचना मिलती है.