ماشینهای مجازی (VM) میتوانند به حالت تعلیق درآیند، از سر گرفته شوند، دوباره راهاندازی شوند و خاموش شوند. هنگامی که هر یک از این رویدادها رخ میدهد، ناشران، مشترکین، کلاینتهای RPC و سرورهای RPC تحت تأثیر قرار میگیرند. شکل 1 چرخه عمر یک بسته خدماتی را نشان میدهد:

شکل ۱. چرخه حیات یک بسته خدماتی.
چرخه حیات بسته خدماتی از این توالی پیروی میکند:
- متد
newبرای ایجاد بستهی سرویس فراخوانی میشود. - مدیر چرخه عمر، بسته سرویس را آغاز میکند و بسته به تنظیمات موجود در پیکربندی ارکستراسیون، تابع
on_startرا فراخوانی میکند. - وقتی ماشین مجازی متوقف یا به حالت تعلیق در میآید، و بسته به تنظیمات پیکربندی ارکستراسیون، مدیر چرخه عمر،
on_stopرا فراخوانی میکند. تابعon_stopباید نخها را برای ناشران، مشترکین، کلاینتهای RPC و سرورهای RPC متوقف کند. - وقتی ماشین مجازی دوباره راهاندازی میشود، اگر بسته سرویس توسط پیکربندی هماهنگسازی طوری پیکربندی شده باشد که دوباره شروع به کار کند،
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 ممکن است اتصال را ببندند یا به حالت تعلیق درآورند تا بتوانند آنها را به طور قابل اعتمادی در ادامه بازیابی کنند. مهم است که برای فراخوانیonStopدر پیادهسازی بسته سرویس، بهSUSPEND_TO_RAM_POST_FINISHیاPOWER_OFF_POST_FINISHتکیه نکنید و در عوض، بهSUSPEND_TO_RAM_ENTER،POWER_OFF_ENTERوWAIT_FOR_FINISHتکیه کنید.
تعیین در دسترس بودن سرویس
مثال زیر نحوه استفاده از API میانافزار در بسته سرویس شما را برای تعیین در دسترس بودن یک واحد سرویس نشان میدهد:
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 یک رابط برنامهنویسی میانافزار (middleware API) است که برای ایجاد رویدادی به نام unit_name استفاده میشود. این جریان رویداد ثبتنام، زمانی که یک واحد سرویس در دسترس قرار میگیرد، مطلع میشود.