Trait akka_projection_rs::SourceProvider
source · pub trait SourceProvider {
type Envelope;
// Required methods
fn source<'life0, 'async_trait, F, FR>(
&'life0 self,
offset: F
) -> Pin<Box<dyn Future<Output = Pin<Box<dyn Stream<Item = Self::Envelope> + Send + 'async_trait>>> + Send + 'async_trait>>
where F: Fn() -> FR + Send + Sync + 'async_trait,
FR: Future<Output = Option<LastOffset>> + Send + 'async_trait,
Self: 'async_trait,
'life0: 'async_trait;
fn load_envelope<'life0, 'async_trait>(
&'life0 self,
persistence_id: PersistenceId,
seq_nr: u64
) -> Pin<Box<dyn Future<Output = Option<Self::Envelope>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
}
Expand description
Provides a source of envelopes using slices as a query.
A slice is deterministically defined based on the persistence id. The purpose is to evenly distribute all persistence ids over the slices.
The consumer can keep track of its current position in the event stream by storing the offset
and restart the
query from a given offset
after a crash/restart.
The exact meaning of the offset
depends on the journal and must be documented by it. It may
be a sequential id number that uniquely identifies the position of each event within the event stream. Distributed
data stores cannot easily support those semantics and they may use a weaker meaning. For example it may be a
timestamp (taken when the event was created or stored). Timestamps are not unique and not strictly ordered, since
clocks on different machines may not be synchronized.
In strongly consistent stores, where the offset
is unique and strictly ordered, the stream should start from the
next event after the offset
. Otherwise, the read journal should ensure that between an invocation that returned
an event with the given offset
, and this invocation, no events are missed. Depending on the journal
implementation, this may mean that this invocation will return events that were already returned by the previous
invocation, including the event with the passed in offset
.
The returned event stream should be ordered by offset
if possible, but this can also be difficult to fulfill for
a distributed data store. The order must be documented by the journal implementation.
The stream is not completed when it reaches the end of the currently stored events, but it continues to push new events when new events are persisted.
Required Associated Types§
Required Methods§
sourcefn source<'life0, 'async_trait, F, FR>(
&'life0 self,
offset: F
) -> Pin<Box<dyn Future<Output = Pin<Box<dyn Stream<Item = Self::Envelope> + Send + 'async_trait>>> + Send + 'async_trait>>where
F: Fn() -> FR + Send + Sync + 'async_trait,
FR: Future<Output = Option<LastOffset>> + Send + 'async_trait,
Self: 'async_trait,
'life0: 'async_trait,
fn source<'life0, 'async_trait, F, FR>( &'life0 self, offset: F ) -> Pin<Box<dyn Future<Output = Pin<Box<dyn Stream<Item = Self::Envelope> + Send + 'async_trait>>> + Send + 'async_trait>>where F: Fn() -> FR + Send + Sync + 'async_trait, FR: Future<Output = Option<LastOffset>> + Send + 'async_trait, Self: 'async_trait, 'life0: 'async_trait,
Given a closure that returns an offset, source envelopes.
sourcefn load_envelope<'life0, 'async_trait>(
&'life0 self,
persistence_id: PersistenceId,
seq_nr: u64
) -> Pin<Box<dyn Future<Output = Option<Self::Envelope>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn load_envelope<'life0, 'async_trait>( &'life0 self, persistence_id: PersistenceId, seq_nr: u64 ) -> Pin<Box<dyn Future<Output = Option<Self::Envelope>> + Send + 'async_trait>>where Self: 'async_trait, 'life0: 'async_trait,
Load a single event on demand. A None is returned if the event for the
given persistence_id
and seq_nr
doesn’t exist.