pub trait Discard<DB: Database>: OutboxRow {
// Required method
fn discard(
conn: &mut DB::Connection,
id: &Self::Id,
) -> impl Future<Output = Result<(), Error>> + Send;
}Expand description
Runs when the handler dropped the message.
The default marks the record processed as Ack does: a dropped message is not sent
again.
§Examples
use ruststream_sqlx::{Outbox, outbox};
#[derive(Outbox, sqlx::FromRow)]
#[outbox(table = "outbox", custom(discard))]
pub struct OrderOutbox {
#[field(id)]
id: i64,
#[field(name)]
name: String,
#[field(payload)]
payload: Vec<u8>,
#[field(processed_at)]
processed_at: Option<DateTime<Utc>>,
}
// A dropped record is marked apart from a processed one.
impl outbox::Discard<Postgres> for OrderOutbox {
async fn discard(conn: &mut PgConnection, id: &i64) -> sqlx::Result<()> {
sqlx::query("UPDATE outbox SET processed_at = now(), dropped = true WHERE id = $1")
.bind(id)
.execute(conn)
.await?;
Ok(())
}
}
pub fn app(pool: PgPool) -> impl App {
let tracking = outbox! { pool: pool, "orders" => OrderOutbox };
RustStream::new(AppInfo::new("orders", "0.1.0"))
.layer(tracking.layer())
.publish_layer(tracking.publish_layer())
.with_broker(MemoryBroker::new(), |b| {
b.include(place).out_reply(Publish);
b.include(fulfil);
b.after_startup(Publish, tracking.republish());
})
}Required Methods§
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".