處理暫停和繼續

虛擬機器 (VM) 可以暫停、繼續、重新啟動及關機。發生上述任一事件時,發布者、訂閱者、RPC 用戶端和 RPC 伺服器都會受到影響。圖 1 顯示服務套裝組合的生命週期:

服務套裝組合的生命週期

圖 1. 服務套裝組合的生命週期。

服務套裝組合生命週期遵循下列順序:

  1. 系統會呼叫 new 方法來建立服務套件。
  2. 生命週期管理工具會啟動服務套件,並根據自動化調度設定中的設定呼叫 on_start
  3. 當 VM 停止或暫停時,生命週期管理工具會根據編排設定中的設定呼叫 on_stopon_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 是服務套件應預期軟體定義車輛 (SDV) 代理程式會回應的最後一個電源狀態。
  • SUSPEND_TO_RAM_POST_FINISH 表示 SDV 代理程式可能會關閉或暫停連線,以便在恢復時可靠地還原連線。請勿在服務套件實作中依賴 SUSPEND_TO_RAM_POST_FINISHPOWER_OFF_POST_FINISH 呼叫 onStop,而是依賴 SUSPEND_TO_RAM_ENTERPOWER_OFF_ENTERWAIT_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。當服務單元可用時,系統會通知這個註冊事件串流。