Skip to content

接入 EventBus

调用方使用 nova_eventbus::Client 连接中心总线。连接配置由 eventbus.toml 提供,组件间请求和响应使用 Serde 类型进行 MessagePack 编码。

use nova_eventbus::{Client, Config, Result};
use nova_config::{Empty, GetRequest};
async fn read_theme() -> Result<()> {
let config = Config::from_file("Nova.EventBus/eventbus.toml")?;
let client = Client::connect(config).await?;
let ids: Vec<String> = client.request("config.list", &Empty {}).await?;
let theme: toml::Value = client
.request("config.get", &GetRequest {
config: "game".into(),
key: "ui.theme".into(),
})
.await?;
println!("{ids:?}: {theme}");
Ok(())
}

方法名采用 service.method 格式,例如 config.get。服务名称与方法名各自限制为 1–256 个 UTF-8 字节。

如果需要观察配置变更,应先订阅再发起写入,避免错过通知:

use nova_config::{Changed, SetRequest};
let mut changes = client.subscribe::<Changed>("config.changed").await?;
client.request::<_, bool>("config.set", &SetRequest {
config: "game".into(),
key: "ui.theme".into(),
value: toml::Value::String("dark".into()),
}).await?;
let changed = changes.recv().await?;
println!("changed: {}", changed.key);

RPC 超时或断开连接时,调用方无法判断写入是否已经落盘。对于写操作,应先读取或重新加载状态,再决定是否重试,避免盲目重复非幂等操作。订阅通知是内存事件,不会在断线期间缓存。

完整的可运行调用示例位于 Nova.Config/examples/component_client.rs。