处理暂停和恢复

虚拟机 (VM) 可以暂停、恢复、重新启动和关机。当发生上述任何事件时,发布者、订阅者、RPC 客户端和 RPC 服务器都会受到影响。图 1 显示了服务包的生命周期:

服务包的生命周期

图 1. 服务包的生命周期。

服务包生命周期遵循以下顺序:

  1. 调用 new 方法以创建服务软件包。
  2. 生命周期管理器会启动服务软件包,并根据编排配置中的设置调用 on_start
  3. 当虚拟机停止或暂停时,生命周期管理器会根据编排配置中的设置调用 on_stopon_stop 函数应停止发布者、订阅者、RPC 客户端和 RPC 服务器的线程。
  4. 当虚拟机恢复运行时,如果服务软件包配置为由编排配置再次启动,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 是一个中间件 API,用于创建名为 unit_name 的事件。当服务单元可用时,系统会通知此注册事件流。