pub struct PgOutboxStore { /* private fields */ }Expand description
PostgreSQL implementation of OutboxStore backed by sqlx::PgPool.
Cheap to clone (the pool and the cached SQL strings are reference-counted).
Implementations§
Source§impl PgOutboxStore
impl PgOutboxStore
Sourcepub fn new(
pool: PgPool,
table_name: impl Into<String>,
) -> Result<Self, OutboxError>
pub fn new( pool: PgPool, table_name: impl Into<String>, ) -> Result<Self, OutboxError>
Build a store for the given pool and table.
SQL statements are templated and cached at construction so each poll cycle re-uses the same strings.
§Errors
Returns OutboxError::Internal if table_name is not a valid
identifier matching ^[a-zA-Z_][a-zA-Z0-9_]*$.
Sourcepub fn table_name(&self) -> &str
pub fn table_name(&self) -> &str
Configured table name.
Sourcepub fn with_dead_letter(
self,
dlq_table: impl Into<String>,
) -> Result<Self, OutboxError>
pub fn with_dead_letter( self, dlq_table: impl Into<String>, ) -> Result<Self, OutboxError>
Activate dead-letter persistence for this store.
When enabled, envelopes that exhaust max_attempts are atomically
moved to dlq_table by OutboxStore::mark_dead_lettered.
§Errors
Returns OutboxError::Internal if dlq_table is not a valid
identifier.
Trait Implementations§
Source§impl Clone for PgOutboxStore
impl Clone for PgOutboxStore
Source§fn clone(&self) -> PgOutboxStore
fn clone(&self) -> PgOutboxStore
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for PgOutboxStore
impl Debug for PgOutboxStore
Source§impl OutboxStore for PgOutboxStore
impl OutboxStore for PgOutboxStore
Source§type Client = PoolConnection<Postgres>
type Client = PoolConnection<Postgres>
Pooled connection guard owned by the worker for one polling cycle.
Source§type Tx<'tx> = Transaction<'tx, Postgres>
type Tx<'tx> = Transaction<'tx, Postgres>
Transaction borrowed from a
Self::Client.Source§fn acquire<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Self::Client, OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn acquire<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Self::Client, OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Acquire a connection from the underlying pool.
Source§fn begin<'a, 'life0, 'async_trait>(
&'life0 self,
client: &'a mut Self::Client,
) -> Pin<Box<dyn Future<Output = Result<Self::Tx<'a>, OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
fn begin<'a, 'life0, 'async_trait>(
&'life0 self,
client: &'a mut Self::Client,
) -> Pin<Box<dyn Future<Output = Result<Self::Tx<'a>, OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
Open a transaction borrowing from the given connection.
Source§fn poll<'a, 'life0, 'life1, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
batch_size: usize,
max_attempts: u32,
) -> Pin<Box<dyn Future<Output = Result<Vec<OutboxEnvelope>, OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn poll<'a, 'life0, 'life1, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
batch_size: usize,
max_attempts: u32,
) -> Pin<Box<dyn Future<Output = Result<Vec<OutboxEnvelope>, OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Poll a batch of pending envelopes, locking them via
FOR UPDATE SKIP LOCKED. Read moreSource§fn mark_delivered<'a, 'life0, 'life1, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_id: Uuid,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn mark_delivered<'a, 'life0, 'life1, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_id: Uuid,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Mark an envelope as successfully delivered.
Source§fn mark_failed<'a, 'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_id: Uuid,
error: &'life2 str,
retry_in: Duration,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn mark_failed<'a, 'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_id: Uuid,
error: &'life2 str,
retry_in: Duration,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Mark an envelope as failed, recording the error and the backoff delay
before the next retry. Read more
Source§fn commit<'a, 'life0, 'async_trait>(
&'life0 self,
tx: Self::Tx<'a>,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
fn commit<'a, 'life0, 'async_trait>(
&'life0 self,
tx: Self::Tx<'a>,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
Commit the transaction.
Source§fn mark_dead_lettered<'a, 'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_id: Uuid,
_error: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn mark_dead_lettered<'a, 'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_id: Uuid,
_error: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Move an envelope that has exhausted its retry budget to the dead-letter store. Read more
Source§fn claim<'a, 'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_ids: &'life2 [Uuid],
lease_for: Duration,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn claim<'a, 'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
tx: &'life1 mut Self::Tx<'a>,
event_ids: &'life2 [Uuid],
lease_for: Duration,
) -> Pin<Box<dyn Future<Output = Result<(), OutboxError>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Claim a batch of envelopes: advance the soft lease and consume one
retry slot. Read more
Auto Trait Implementations§
impl !RefUnwindSafe for PgOutboxStore
impl !UnwindSafe for PgOutboxStore
impl Freeze for PgOutboxStore
impl Send for PgOutboxStore
impl Sync for PgOutboxStore
impl Unpin for PgOutboxStore
impl UnsafeUnpin for PgOutboxStore
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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