Виртуальные машины (ВМ) могут быть приостановлены, возобновлены, перезагружены и выключены. При возникновении любого из этих событий затрагиваются издатели, подписчики, RPC-клиенты и RPC-серверы. На рисунке 1 показан жизненный цикл пакета служб:

Рисунок 1. Жизненный цикл пакета услуг.
Жизненный цикл пакета услуг протекает в следующей последовательности:
- Для создания пакета сервисов вызывается
newметод. - Менеджер жизненного цикла запускает пакет служб и, в зависимости от настроек в конфигурации оркестрации, вызывает
on_start. - Когда виртуальная машина останавливается или приостанавливается, и в зависимости от настроек в конфигурации оркестрации менеджер жизненного цикла вызывает
on_stopon_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 могут закрывать или приостанавливать соединение, чтобы иметь возможность надежно восстановить его при возобновлении работы. Важно не полагаться на вызовonStopSUSPEND_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 — это API промежуточного ПО, используемый для создания события с unit_name . Этот поток событий регистрации получает уведомления, когда становится доступен сервисный модуль.