01_runtime_with_persistence/
01_runtime_with_persistence.rs

1// 运行:
2//   cargo run -p moduforge-persistence --example 01_runtime_with_persistence
3// 说明:
4//   - 使用 schema/main.xml 加载节点定义
5//   - 注入持久化中间件(事件 + 定期快照)
6//   - 演示新增一个 dwgc 节点并分发事务
7
8use std::sync::Arc;
9use mf_core::{EditorOptionsBuilder, ForgeAsyncRuntime, ForgeResult};
10use mf_persistence::api::{CommitMode, PersistOptions};
11use mf_persistence::subscriber::SnapshotSubscriber;
12use mf_persistence::sqlite::SqliteEventStore;
13// runtime-only example: for export/import, see export_doc.rs and export_zip.rs
14
15#[tokio::main]
16async fn main() -> ForgeResult<()> {
17    // 1) 构造事件存储(SQLite WAL)
18    let store = SqliteEventStore::open(
19        "./data/persistence_demo.sqlite",
20        CommitMode::AsyncDurable { group_window_ms: 8 },
21    )?;
22
23    // 2) 配置持久化选项(定期快照)
24    let persist_opts = PersistOptions {
25        commit_mode: CommitMode::AsyncDurable { group_window_ms: 8 },
26        snapshot_every_n_events: 1000,
27        snapshot_every_bytes: 8 * 1024 * 1024,
28        snapshot_every_ms: 5 * 60 * 1000,
29        compression: true,
30    };
31
32    // 3) 注入持久化订阅者(由事件驱动持久化与快照)
33    let subscriber = Arc::new(SnapshotSubscriber::new(
34        store.clone(),
35        persist_opts.clone(),
36        "default_doc",
37    ));
38
39    let options =
40        EditorOptionsBuilder::new().add_event_handler(subscriber).build();
41
42    // 4) 从 XML schema 加载运行时(注意路径相对于工作目录,必要时调整为 "../../schema/main.xml")
43    let xml_path = "schema/main.xml";
44    let mut editor =
45        ForgeAsyncRuntime::from_xml_schema_path(xml_path, Some(options), None)
46            .await?;
47
48    // 5) 构造一个新增节点事务(dwgc)并分发
49    let doc = editor.doc();
50    let mut tr = editor.get_tr();
51    let schema = &tr.schema;
52    // 依赖 main.xml 中定义的 <node name="dwgc" ...>
53    let factory = schema.factory();
54    let dw_node = factory.create_tree("dwgc", None, None, vec![], None)?;
55    tr.add_node(doc.root_id().clone(), vec![dw_node])?;
56    editor.dispatch(tr).await?;
57    // 睡眠五秒,等待持久化与快照
58    tokio::time::sleep(std::time::Duration::from_secs(5)).await;
59    let state = editor.get_state();
60    println!("事务已分发并持久化,当前版本: {}", state.version);
61
62    // 如需导出/导入演示,请运行:
63    // cargo run -p moduforge-persistence --example export_doc
64    // cargo run -p moduforge-persistence --example export_zip
65    Ok(())
66}