虚拟机 (VM) 可以暂停、恢复、重新启动和关机。当发生上述任何事件时,发布者、订阅者、RPC 客户端和 RPC 服务器都会受到影响。图 1 显示了服务包的生命周期:
图 1. 服务包的生命周期。
服务包生命周期遵循以下顺序:
- 调用
new方法以创建服务软件包。 - 生命周期管理器会启动服务软件包,并根据编排配置中的设置调用
on_start。 - 当虚拟机停止或暂停时,生命周期管理器会根据编排配置中的设置调用
on_stop。on_stop函数应停止发布者、订阅者、RPC 客户端和 RPC 服务器的线程。 - 当虚拟机恢复运行时,如果服务软件包配置为由编排配置再次启动,
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 是一个中间件 API,用于创建名为 unit_name 的事件。当服务单元可用时,系统会通知此注册事件流。