一時停止と再開を処理する

仮想マシン(VM)は、一時停止、再開、再起動、シャットダウンできます。これらのイベントが発生すると、パブリッシャー、サブスクライバー、RPC クライアント、RPC サーバーが影響を受けます。図 1 は、サービス バンドルのライフサイクルを示しています。

サービス バンドルのライフサイクル

図 1. サービス バンドルのライフサイクル。

サービス バンドルのライフサイクルは次の順序で進みます。

  1. new メソッドが呼び出され、サービス バンドルが作成されます。
  2. ライフサイクル マネージャーはサービス バンドルを起動し、オーケストレーション構成の設定に応じて on_start を呼び出します。
  3. VM が停止または一時停止すると、オーケストレーション構成の設定に応じて、ライフサイクル マネージャーが on_stop を呼び出します。on_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_FINISH または POWER_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 です。この登録イベント ストリームは、サービス ユニットが利用可能になったときに通知されます。