pub enum PulsarPosition {
Earliest,
Latest,
MessageId(MessageIdData),
Timestamp(u64),
}Expand description
A position in a topic’s retained log, accepted by
Seeker::seek.
Captured positions (Positioned::position) carry the pinned semantics the framework
defines: seeking to one redelivers exactly that message. The timestamp form keeps the
broker’s own publish-time semantics instead.
The constructors exist because the start_at(..) clause of #[subscriber] recovers the
position type from the constructor path; a bare variant path does not name its type in the
tokens the macro sees.
§Examples
use ruststream_pulsar::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Tick {
price: f64,
replay_from: Option<u64>,
}
/// A price board: the backlog is stale on startup, so the subscription opens at the tip, and
/// a tick that asks for a replay rewinds it to a point in time.
#[subscriber(
PulsarSubscription::new("ticks", "board"),
start_at(PulsarPosition::latest())
)]
async fn show(tick: &Tick, Ctx(seeker): Ctx<SeekHandle>) -> HandlerOutcome {
tracing::info!(price = tick.price, "tick shown");
if let Some(millis) = tick.replay_from
&& seeker.seek(PulsarPosition::timestamp(millis)).await.is_err()
{
return HandlerOutcome::retry();
}
HandlerOutcome::ack()
}Variants§
Earliest
The beginning of the log: every message the topics still retain is redelivered.
This is a seek, not the server-side initial position, which Pulsar applies only when a
subscription is first created. A subscription is durable broker-side state, so a
start_at(PulsarPosition::earliest()) clause rewinds an existing subscription’s cursor
on every startup, replaying the retained backlog each time the service starts.
Latest
The tip of the log: only messages published after the seek are delivered.
MessageId(MessageIdData)
The position of a delivered message.
Timestamp(u64)
Publish time, in milliseconds since the Unix epoch.
Implementations§
Source§impl PulsarPosition
impl PulsarPosition
Sourcepub fn earliest() -> Self
pub fn earliest() -> Self
The beginning of the log; see PulsarPosition::Earliest for how it interacts with a
durable subscription’s cursor.
§Examples
use ruststream_pulsar::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Job {
id: u64,
resume_at: Option<u64>,
}
/// Reads the whole retained backlog on every startup, and skips forward past a region the
/// producer marked poisoned.
#[subscriber(
PulsarSubscription::pattern("persistent://public/default/orders-.*", "audit"),
start_at(PulsarPosition::earliest())
)]
async fn audit(job: &Job, Ctx(seeker): Ctx<SeekHandle>) -> HandlerOutcome {
tracing::info!(job.id, "audited");
if let Some(millis) = job.resume_at
&& seeker.seek(PulsarPosition::timestamp(millis)).await.is_err()
{
return HandlerOutcome::retry();
}
HandlerOutcome::ack()
}Sourcepub fn latest() -> Self
pub fn latest() -> Self
The tip of the log; see PulsarPosition::Latest.
Sourcepub fn timestamp(millis: u64) -> Self
pub fn timestamp(millis: u64) -> Self
A publish time, in milliseconds since the Unix epoch; see
PulsarPosition::Timestamp.
Trait Implementations§
Source§impl Clone for PulsarPosition
impl Clone for PulsarPosition
Source§impl Debug for PulsarPosition
impl Debug for PulsarPosition
impl Eq for PulsarPosition
Source§impl PartialEq for PulsarPosition
impl PartialEq for PulsarPosition
impl StructuralPartialEq for PulsarPosition
Auto Trait Implementations§
impl Freeze for PulsarPosition
impl RefUnwindSafe for PulsarPosition
impl Send for PulsarPosition
impl Sync for PulsarPosition
impl Unpin for PulsarPosition
impl UnsafeUnpin for PulsarPosition
impl UnwindSafe for PulsarPosition
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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> ⓘ
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> ⓘ
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 more