pub struct SnapshotSubscriber<E: EventStore + 'static> { /* private fields */ }Implementations§
Source§impl<E: EventStore + 'static> SnapshotSubscriber<E>
impl<E: EventStore + 'static> SnapshotSubscriber<E>
Sourcepub fn new(
store: Arc<E>,
options: PersistOptions,
default_doc_id: impl Into<String>,
) -> Self
pub fn new( store: Arc<E>, options: PersistOptions, default_doc_id: impl Into<String>, ) -> Self
Examples found in repository?
examples/01_runtime_with_persistence.rs (lines 33-37)
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}Trait Implementations§
Source§impl<E: EventStore + 'static> Clone for SnapshotSubscriber<E>
impl<E: EventStore + 'static> Clone for SnapshotSubscriber<E>
Source§impl<E: EventStore + 'static> Debug for SnapshotSubscriber<E>
impl<E: EventStore + 'static> Debug for SnapshotSubscriber<E>
Source§impl<E: EventStore + 'static> EventHandler<Event> for SnapshotSubscriber<E>
impl<E: EventStore + 'static> EventHandler<Event> for SnapshotSubscriber<E>
Auto Trait Implementations§
impl<E> Freeze for SnapshotSubscriber<E>
impl<E> !RefUnwindSafe for SnapshotSubscriber<E>
impl<E> Send for SnapshotSubscriber<E>
impl<E> Sync for SnapshotSubscriber<E>
impl<E> Unpin for SnapshotSubscriber<E>
impl<E> UnwindSafe for SnapshotSubscriber<E>where
E: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Message for T
impl<T> Message for T
Source§fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
Convert a BoxedMessage to this concrete type
Source§fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
Convert this message to a BoxedMessage