01_runtime_with_persistence/
01_runtime_with_persistence.rs1use 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#[tokio::main]
16async fn main() -> ForgeResult<()> {
17 let store = SqliteEventStore::open(
19 "./data/persistence_demo.sqlite",
20 CommitMode::AsyncDurable { group_window_ms: 8 },
21 )
22 .await?;
23
24 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 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 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 let doc = editor.doc();
51 let mut tr = editor.get_tr();
52 let schema = &tr.schema;
53 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 tokio::time::sleep(std::time::Duration::from_secs(5)).await;
60 let state = editor.get_state();
61 println!("事务已分发并持久化,当前版本: {}", state.version);
62
63 Ok(())
67}