pub struct PulsarBatchContext { /* private fields */ }Expand description
The subscription-scoped batch context of a Pulsar subscription: its seeker, shared by every delivery of the batch.
The runtime builds one per dispatched batch from the batch’s first delivery (see
BuildBatchContext), and a batch body reads it by key - SeekHandle - through
ctx.context(..). A Position has no place here: a batch spans many deliveries, so where
to seek rides the elements themselves (a &[Message<H, T>] batch reads it off each element’s
header contract). Keeping this a separate type from PulsarContext is what rejects a batch
body asking for per-delivery fields at compile time.
Pulsar’s client hands over one delivery at a time, so a batch here is assembled on the client
from the size the mount site’s batch(n) names. The body sees the same context, seeker and
settlement as on a broker that batches on the wire.
§Examples
use ruststream_pulsar::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Job {
id: u64,
rewind: bool,
}
/// A batch that carries the rewind marker replays the retained backlog once it is settled:
/// the next batch opens at the beginning of the log.
#[subscriber(PulsarSubscription::new("jobs.bulk", "bulk-workers"))]
async fn work(jobs: &[Job], ctx: &mut Context<'_, PulsarBatchContext>) -> HandlerOutcome {
let first = jobs.first().map(|job| job.id);
tracing::info!(count = jobs.len(), ?first, "jobs received");
if jobs.iter().any(|job| job.rewind)
&& ctx
.context(SeekHandle)
.seek(PulsarPosition::earliest())
.await
.is_err()
{
return HandlerOutcome::retry();
}
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("jobs", "0.1.0")).with_broker(
PulsarBroker::new("pulsar://localhost:6650"),
|b| {
b.include(work.batch(nonzero!(100)));
},
)
}Trait Implementations§
Source§impl BuildBatchContext<PulsarMessage> for PulsarBatchContext
impl BuildBatchContext<PulsarMessage> for PulsarBatchContext
Source§fn build(first: &PulsarMessage) -> Self
fn build(first: &PulsarMessage) -> Self
Source§impl Debug for PulsarBatchContext
impl Debug for PulsarBatchContext
Source§impl Field<PulsarBatchContext> for SeekHandle
impl Field<PulsarBatchContext> for SeekHandle
Source§type Value<'a> = &'a PulsarSeeker
type Value<'a> = &'a PulsarSeeker
'a.Source§fn get(self, src: &PulsarBatchContext) -> &PulsarSeeker
fn get(self, src: &PulsarBatchContext) -> &PulsarSeeker
src.Auto Trait Implementations§
impl Freeze for PulsarBatchContext
impl RefUnwindSafe for PulsarBatchContext
impl Send for PulsarBatchContext
impl Sync for PulsarBatchContext
impl Unpin for PulsarBatchContext
impl UnsafeUnpin for PulsarBatchContext
impl UnwindSafe for PulsarBatchContext
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> 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