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
23 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 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 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 let doc = editor.doc();
50 let mut tr = editor.get_tr();
51 let schema = &tr.schema;
52 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 tokio::time::sleep(std::time::Duration::from_secs(5)).await;
59 let state = editor.get_state();
60 println!("事务已分发并持久化,当前版本: {}", state.version);
61
62 Ok(())
66}