pub struct RabbitExchange { /* private fields */ }Expand description
Describes the exchange side of a RabbitQueue binding.
Like every descriptor in this crate it only records the EXPECTED topology; nothing is
declared unless the broker was built with
declare_topology(true).
§Examples
use ruststream_lapin::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct OrderPlaced {
id: u64,
}
#[subscriber(RabbitQueue::new("orders")
.bind(RabbitExchange::topic("events").durable(true), "order.*"))]
async fn on_order(event: &OrderPlaced) -> HandlerOutcome {
tracing::info!(event.id, "order placed");
HandlerOutcome::ack()
}
fn app() -> RustStream {
let broker = LapinBroker::new("amqp://localhost:5672").declare_topology(true);
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(broker, |b| {
b.include(on_order);
})
}Implementations§
Source§impl RabbitExchange
impl RabbitExchange
Sourcepub fn direct(name: impl Into<String>) -> Self
pub fn direct(name: impl Into<String>) -> Self
A direct exchange: routes on an exact routing-key match.
Sourcepub fn topic(name: impl Into<String>) -> Self
pub fn topic(name: impl Into<String>) -> Self
A topic exchange: routes on dot-separated routing-key patterns (order.*).
Sourcepub fn fanout(name: impl Into<String>) -> Self
pub fn fanout(name: impl Into<String>) -> Self
A fanout exchange: routes every message to every bound queue.
Sourcepub fn headers(name: impl Into<String>) -> Self
pub fn headers(name: impl Into<String>) -> Self
A headers exchange: routes on the binding’s arguments instead of the routing key.
A queue binds to one with bind_with, whose argument
table carries x-match (all or any) and the headers a message has to match. The
plain bind sends no arguments, and an empty table here
matches every message the exchange gets rather than none.
§Examples
use ruststream_lapin::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Order {
id: u64,
}
// The binding arguments: how to match, then the headers matched on.
fn gold_in_eu(x_match: &str) -> FieldTable {
let mut arguments = FieldTable::default();
arguments.insert("x-match".into(), AMQPValue::LongString(x_match.into()));
arguments.insert("region".into(), AMQPValue::LongString("eu".into()));
arguments.insert("tier".into(), AMQPValue::LongString("gold".into()));
arguments
}
#[subscriber(RabbitQueue::new("orders.eu.gold")
.bind_with(RabbitExchange::headers("orders"), "", gold_in_eu("all")))]
async fn on_gold_in_eu(order: &Order) -> HandlerOutcome {
tracing::info!(order.id, "gold order in the EU");
HandlerOutcome::ack()
}
// One header is enough here, where the binding above needs both.
#[subscriber(RabbitQueue::new("orders.eu.or.gold")
.bind_with(RabbitExchange::headers("orders"), "", gold_in_eu("any")))]
async fn on_gold_or_eu(order: &Order) -> HandlerOutcome {
tracing::info!(order.id, "gold order or an order in the EU");
HandlerOutcome::ack()
}
fn app() -> RustStream {
let broker = LapinBroker::new("amqp://localhost:5672").declare_topology(true);
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(broker, |b| {
b.include(on_gold_in_eu);
b.include(on_gold_or_eu);
})
}Sourcepub fn custom(name: impl Into<String>, kind: impl Into<String>) -> Self
pub fn custom(name: impl Into<String>, kind: impl Into<String>) -> Self
An exchange of a plugin-provided type, for example "x-delayed-message".
A plugin that routes by binding arguments takes them through
bind_with.
Sourcepub fn consistent_hash(name: impl Into<String>) -> Self
pub fn consistent_hash(name: impl Into<String>) -> Self
A consistent-hash exchange (the x-consistent-hash type from the
rabbitmq_consistent_hash_exchange
plugin): distributes messages across the queues bound to it by hashing the routing key,
so partition-like fan-out is a server-side concern rather than a client one.
Each queue binds with a routing key that is its integer weight ("1", "2", …); the
broker splits the hash space proportionally. Requires the plugin to be enabled on the
broker, so it lives behind the plugin-consistent-hash feature.
§Examples
use ruststream_lapin::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Order {
id: u64,
}
// This queue binds with weight 1, so it takes its share of the hash space.
#[subscriber(RabbitQueue::new("orders.shard-a")
.bind(RabbitExchange::consistent_hash("orders-by-key"), "1"))]
async fn on_order(order: &Order) -> HandlerOutcome {
tracing::info!(order.id, "shard a took the order");
HandlerOutcome::ack()
}
fn app() -> RustStream {
let broker = LapinBroker::new("amqp://localhost:5672").declare_topology(true);
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(broker, |b| {
b.include(on_order);
})
}Sourcepub fn durable(self, durable: bool) -> Self
pub fn durable(self, durable: bool) -> Self
Whether the exchange survives a broker restart. Defaults to true.
Sourcepub fn auto_delete(self, auto_delete: bool) -> Self
pub fn auto_delete(self, auto_delete: bool) -> Self
Whether the exchange is deleted when its last binding is removed. Defaults to false.
Trait Implementations§
Source§impl Clone for RabbitExchange
impl Clone for RabbitExchange
Source§impl Debug for RabbitExchange
impl Debug for RabbitExchange
impl Eq for RabbitExchange
Source§impl PartialEq for RabbitExchange
impl PartialEq for RabbitExchange
impl StructuralPartialEq for RabbitExchange
Auto Trait Implementations§
impl Freeze for RabbitExchange
impl RefUnwindSafe for RabbitExchange
impl Send for RabbitExchange
impl Sync for RabbitExchange
impl Unpin for RabbitExchange
impl UnsafeUnpin for RabbitExchange
impl UnwindSafe for RabbitExchange
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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