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 34-38)
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}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> !RefUnwindSafe for SnapshotSubscriber<E>
impl<E> Freeze for SnapshotSubscriber<E>
impl<E> Send for SnapshotSubscriber<E>
impl<E> Sync for SnapshotSubscriber<E>
impl<E> Unpin for SnapshotSubscriber<E>
impl<E> UnsafeUnpin for SnapshotSubscriber<E>where
Arc<E>: UnsafeUnpin,
impl<E> UnwindSafe for SnapshotSubscriber<E>where
Arc<E>: UnwindSafe,
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,
impl<T> ErasedDestructor for Twhere
T: 'static,
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