Skip to main content

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    .await?;
23
24    // 2) 配置持久化选项(定期快照)
25    let persist_opts = PersistOptions {
26        commit_mode: CommitMode::AsyncDurable { group_window_ms: 8 },
27        snapshot_every_n_events: 1000,
28        snapshot_every_bytes: 8 * 1024 * 1024,
29        snapshot_every_ms: 5 * 60 * 1000,
30        compression: true,
31    };
32
33    // 3) 注入持久化订阅者(由事件驱动持久化与快照)
34    let subscriber = Arc::new(SnapshotSubscriber::new(
35        store.clone(),
36        persist_opts.clone(),
37        "default_doc",
38    ));
39
40    let options =
41        EditorOptionsBuilder::new().add_event_handler(subscriber).build();
42
43    // 4) 从 XML schema 加载运行时(注意路径相对于工作目录,必要时调整为 "../../schema/main.xml")
44    let xml_path = "schema/main.xml";
45    let mut editor =
46        ForgeAsyncRuntime::from_xml_schema_path(xml_path, Some(options), None)
47            .await?;
48
49    // 5) 构造一个新增节点事务(dwgc)并分发
50    let doc = editor.doc();
51    let mut tr = editor.get_tr();
52    let schema = &tr.schema;
53    // 依赖 main.xml 中定义的 <node name="dwgc" ...>
54    let factory = schema.factory();
55    let dw_node = factory.create_tree("dwgc", None, None, vec![], None)?;
56    tr.add_node(doc.root_id().clone(), vec![dw_node])?;
57    editor.dispatch(tr).await?;
58    // 睡眠五秒,等待持久化与快照
59    tokio::time::sleep(std::time::Duration::from_secs(5)).await;
60    let state = editor.get_state();
61    println!("事务已分发并持久化,当前版本: {}", state.version);
62
63    // 如需导出/导入演示,请运行:
64    // cargo run -p moduforge-persistence --example export_doc
65    // cargo run -p moduforge-persistence --example export_zip
66    Ok(())
67}