虛擬機器 (VM) 可以暫停、繼續、重新啟動及關機。發生上述任一事件時,發布者、訂閱者、RPC 用戶端和 RPC 伺服器都會受到影響。圖 1 顯示服務套裝組合的生命週期:
圖 1. 服務套裝組合的生命週期。
服務套裝組合生命週期遵循下列順序:
- 系統會呼叫
new方法來建立服務套件。 - 生命週期管理工具會啟動服務套件,並根據自動化調度設定中的設定呼叫
on_start。 - 當 VM 停止或暫停時,生命週期管理工具會根據編排設定中的設定呼叫
on_stop。on_stop函式應停止發布者、訂閱者、RPC 用戶端和 RPC 伺服器的執行緒。 - 如果服務套件設定為由協調設定再次啟動,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是服務套件應預期軟體定義車輛 (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。
判斷服務是否可用
以下範例說明如何在服務套件中使用中介軟體 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 是用來建立 unit_name 事件的中介軟體 API。當服務單元可用時,系統會通知這個註冊事件串流。