Virtuelle Maschinen (VMs) können angehalten, fortgesetzt, neu gestartet und heruntergefahren werden. Wenn eines dieser Ereignisse eintritt, sind Publisher, Abonnenten, RPC-Clients und RPC-Server betroffen. Abbildung 1 zeigt den Lebenszyklus eines Dienstpakets:
Abbildung 1. Lebenszyklus eines Service-Pakets.
Der Lebenszyklus eines Servicepakets folgt dieser Reihenfolge:
- Die Methode
newwird aufgerufen, um das Dienstpaket zu erstellen. - Der Lifecycle-Manager startet das Dienstbündel und ruft je nach den Einstellungen in der Orchestrierungskonfiguration
on_startauf. - Wenn die VM beendet oder angehalten wird, ruft der Lifecycle Manager je nach den Einstellungen in der Orchestrierungskonfiguration
on_stopauf. Die Funktionon_stopsollte die Threads für Publisher, Abonnenten, RPC-Clients und RPC-Server beenden. - Wenn die VM fortgesetzt wird, kann
on_startdie Threads neu erstellen, wenn das Dienst-Bundle so konfiguriert ist, dass es durch die Orchestrierungskonfiguration neu gestartet wird.
Konfiguration zum Verarbeiten von Anhalten und Fortsetzen erstellen
Das folgende Beispiel zeigt eine Konfiguration für das Anhalten und Fortsetzen:
# 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" }
}
Wobei:
WAIT_FOR_FINISHist der letzte Stromversorgungsstatus, in dem das Dienstpaket erwarten sollte, dass Software Defined Vehicle (SDV)-Agents reagieren.SUSPEND_TO_RAM_POST_FINISHgibt an, dass SDV-Agents die Verbindung möglicherweise schließen oder unterbrechen, um sie beim Fortsetzen zuverlässig wiederherstellen zu können. Es ist wichtig, sich bei der Implementierung des Dienstbündels nicht aufSUSPEND_TO_RAM_POST_FINISHoderPOWER_OFF_POST_FINISHzu verlassen, umonStopaufzurufen, sondern stattdessen aufSUSPEND_TO_RAM_ENTER,POWER_OFF_ENTERundWAIT_FOR_FINISH.
Dienstverfügbarkeit ermitteln
Das folgende Beispiel zeigt, wie Sie die Middleware-API in Ihrem Service-Bundle verwenden, um festzustellen, ob eine Serviceeinheit verfügbar ist:
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.");
}
}
Die create_server_registration_event_stream ist eine Middleware-API, mit der das Ereignis unit_name erstellt wird. Dieser Registrierungsereignisstream wird benachrichtigt, wenn eine Serviceeinheit verfügbar wird.