pub struct NamedDelivery<DB, D = BuiltIn<DB>>where
DB: QueueDatabase + RoleColumns,
D: ByName<DB> + 'static,{ /* private fields */ }Expand description
A delivery of a by-name subscription: a row of the table its name’s route leads to.
It settles as an InboxDelivery does. A route whose row leaves every
event to the crate delivers its rows read by role: no box and no dynamic call per message, as
through an InboxQueue. A row that overrides an event, or holds a column
type the crate does not read itself, settles through its own code: each delivery is boxed, and
each settlement is a dynamic call whose future is boxed too.
§Examples
use ruststream::OutgoingMessage;
use ruststream::prelude::*;
use ruststream_sqlx::{Inbox, Publish, SqlxBroker};
use serde::Deserialize;
use sqlx::{PgConnection, PgPool, Postgres};
#[derive(Inbox, sqlx::FromRow)]
#[inbox(table = "email_jobs")]
pub struct SendEmail {
#[field(id, generated)]
job_id: i64,
#[field(group)]
name: String,
#[field(payload)]
payload: Vec<u8>,
}
impl Publish<Postgres> for SendEmail {
async fn publish(
conn: &mut PgConnection,
message: &OutgoingMessage<'_>,
) -> Result<(), sqlx::Error> {
sqlx::query("INSERT INTO email_jobs (name, payload) VALUES ($1, $2)")
.bind(message.name())
.bind(message.payload())
.execute(conn)
.await?;
Ok(())
}
}
#[derive(Deserialize)]
struct Email {
to: String,
}
// `emails` is a name: its route leads it to `email_jobs`, and each delivery settles there.
#[subscriber("emails")]
async fn send(email: &Email) -> HandlerOutcome {
if email.to.is_empty() {
return HandlerOutcome::drop();
}
HandlerOutcome::ack()
}
pub fn app(pool: PgPool) -> RustStream {
RustStream::new(AppInfo::new("mailer", "0.1.0")).with_broker(
SqlxBroker::new(pool).route::<SendEmail>("emails"),
|b| {
b.include(send);
},
)
}Trait Implementations§
Source§impl<DB, D> Debug for NamedDelivery<DB, D>where
DB: QueueDatabase + RoleColumns,
D: ByName<DB> + 'static,
impl<DB, D> Debug for NamedDelivery<DB, D>where
DB: QueueDatabase + RoleColumns,
D: ByName<DB> + 'static,
Source§impl<DB, D> IncomingMessage for NamedDelivery<DB, D>where
DB: QueueDatabase + RoleColumns,
D: ByName<DB> + 'static,
impl<DB, D> IncomingMessage for NamedDelivery<DB, D>where
DB: QueueDatabase + RoleColumns,
D: ByName<DB> + 'static,
Source§fn decode_error(&self) -> Option<&CodecError>
fn decode_error(&self) -> Option<&CodecError>
The error the broker met while reading this delivery, or
None when it read the delivery
whole. Read moreSource§fn partition_key(&self) -> Option<&[u8]>
fn partition_key(&self) -> Option<&[u8]>
Returns the routing key the broker partitioned this message by, or
None when the
message carries no key. Read moreSource§fn redelivery_count(&self) -> Option<u64>
fn redelivery_count(&self) -> Option<u64>
How many times the broker has delivered this message, counting this delivery.
None
where the transport counts nothing. Read moreSource§async fn ack(self) -> Result<(), AckError>
async fn ack(self) -> Result<(), AckError>
Acknowledges successful processing. Consumes the message handle. Read more
Source§async fn nack(self, requeue: bool) -> Result<(), AckError>
async fn nack(self, requeue: bool) -> Result<(), AckError>
Negatively acknowledges the message. When
requeue is true the broker should
redeliver according to its own retry policy; when false it should drop or dead-letter
the message. Read moreSource§fn supports_nack_after(&self) -> bool
fn supports_nack_after(&self) -> bool
Reports whether this transport can honor
nack_after natively. Read moreAuto Trait Implementations§
impl<DB, D = BuiltIn<DB>> !RefUnwindSafe for NamedDelivery<DB, D>
impl<DB, D = BuiltIn<DB>> !UnwindSafe for NamedDelivery<DB, D>
impl<DB, D> Freeze for NamedDelivery<DB, D>where
Delivered<DB, D>: Freeze,
impl<DB, D> Send for NamedDelivery<DB, D>where
Delivered<DB, D>: Send,
impl<DB, D> Sync for NamedDelivery<DB, D>where
Delivered<DB, D>: Sync,
impl<DB, D> Unpin for NamedDelivery<DB, D>where
Delivered<DB, D>: Unpin,
impl<DB, D> UnsafeUnpin for NamedDelivery<DB, D>where
Delivered<DB, D>: UnsafeUnpin,
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, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
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