pub struct FileBatchContext { /* private fields */ }Expand description
The file transport’s subscription-scoped batch context: the subscription’s own seeker, shared by every delivery of the batch.
The runtime builds one per dispatched batch from the batch’s first delivery, and a batch body
reads it by key - SeekHandle. Per-delivery data (a Position) has no place here: a
batch spans many deliveries, so the position a body reacts to rides the elements themselves,
and keeping this a separate type from FileContext is what rejects a batch body asking for
per-delivery fields at compile time.
§Examples
The batch settles first, so a seek from its body applies to the batches after it:
use ruststream_sea_file::file::prelude::*;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Job {
id: u64,
resume_at: Option<u64>,
}
#[subscriber(FileStream::new("jobs"), start_at(FilePosition::beginning()))]
async fn drain(jobs: &[Job], ctx: &mut Context<'_, FileBatchContext>) -> HandlerOutcome {
tracing::info!(jobs = jobs.len(), "drained");
let Some(resume_at) = jobs.iter().find_map(|job| job.resume_at) else {
return HandlerOutcome::ack();
};
if let Err(error) = ctx
.context(SeekHandle)
.seek(FilePosition::sequence(resume_at))
.await
{
tracing::warn!(resume_at, %error, "seek refused");
}
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("worker", "0.1.0"))
.with_broker(FileBroker::new("/tmp/jobs.ss"), |b| {
b.include(drain.batch(nonzero!(3)));
})
}A batch body that asks for a per-delivery position does not compile: Position is a key of
FileContext alone.
ⓘ
use ruststream_sea_file::file::prelude::*;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct Job {
id: u64,
}
#[subscriber(FileStream::new("jobs"))]
async fn drain(jobs: &[Job], ctx: &mut Context<'_, FileBatchContext>) -> HandlerOutcome {
let first: FilePosition = ctx.context(Position);
tracing::info!(jobs = jobs.len(), ?first, "drained");
HandlerOutcome::ack()
}Trait Implementations§
Source§impl BuildBatchContext<FileMessage> for FileBatchContext
impl BuildBatchContext<FileMessage> for FileBatchContext
Source§fn build(first: &FileMessage) -> Self
fn build(first: &FileMessage) -> Self
Builds the context value by reading subscription-scoped fields out of the batch’s first
delivery, or out of the batch itself where it lends its values as one slice.
Source§impl Debug for FileBatchContext
impl Debug for FileBatchContext
Source§impl Field<FileBatchContext> for SeekHandle
impl Field<FileBatchContext> for SeekHandle
Source§type Value<'a> = &'a FileSeeker
type Value<'a> = &'a FileSeeker
The value read through this key, borrowed from the source for
'a.Source§fn get(self, src: &FileBatchContext) -> &FileSeeker
fn get(self, src: &FileBatchContext) -> &FileSeeker
Reads this key’s field out of
src.Auto Trait Implementations§
impl !RefUnwindSafe for FileBatchContext
impl !UnwindSafe for FileBatchContext
impl Freeze for FileBatchContext
impl Send for FileBatchContext
impl Sync for FileBatchContext
impl Unpin for FileBatchContext
impl UnsafeUnpin for FileBatchContext
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> 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 more