154 releases (57 stable)
new 3.0.0-beta.1 | Mar 8, 2025 |
---|---|
2.5.1 | Mar 8, 2025 |
2.5.0 | Jul 27, 2024 |
2.3.1 | Jul 14, 2023 |
0.25.0 | Jul 12, 2019 |
#9 in Database interfaces
160,621 downloads per month
Used in 103 crates
(88 directly)
345KB
9K
SLoC
This project follows the AMQP 0.9.1 specifications, targeting especially RabbitMQ.
Features
- unstable: enable access to the experimental reconnection features
- codegen: force code generation (default to pregenerated sources)
- vendored-openssl: use a vendored openssl version instead of the system one (when using openssl backend)
- verbose-errors: enable more verbose errors in the AMQP parser
TLS backends
- native-tls
- openssl
- rustls (default)
Rustls certificates store
- rustls-native-certs (default)
- rustls-webpki-roots-certs
Warning about crypto backends for rustls
A crypto implementation must be enabled in rustls using feature flags. We mimic what rustls does, providing one feature flag per implementation and enabling the same as rustls by default. Available options are:
rustls--aws_lc_rs
(default)rustls--ring
Integration with third-party runtimes
Lapin can use any runtime of your choice by passing it to the ConnectionProperties
.
You can configure the executor to use through executor-trait.
You can configure the reactor to use through reactor-trait.
There are implementations for tokio, async-std and others.
Example
use futures_lite::stream::StreamExt;
use lapin::{
options::*, publisher_confirm::Confirmation, types::FieldTable, BasicProperties, Connection,
ConnectionProperties, Result,
};
use tracing::info;
fn main() -> Result<()> {
if std::env::var("RUST_LOG").is_err() {
std::env::set_var("RUST_LOG", "info");
}
tracing_subscriber::fmt::init();
let addr = std::env::var("AMQP_ADDR").unwrap_or_else(|_| "amqp://127.0.0.1:5672/%2f".into());
async_global_executor::block_on(async {
let conn = Connection::connect(
&addr,
ConnectionProperties::default(),
)
.await?;
info!("CONNECTED");
let channel_a = conn.create_channel().await?;
let channel_b = conn.create_channel().await?;
let queue = channel_a
.queue_declare(
"hello",
QueueDeclareOptions::default(),
FieldTable::default(),
)
.await?;
info!(?queue, "Declared queue");
let mut consumer = channel_b
.basic_consume(
"hello",
"my_consumer",
BasicConsumeOptions::default(),
FieldTable::default(),
)
.await?;
async_global_executor::spawn(async move {
info!("will consume");
while let Some(delivery) = consumer.next().await {
let delivery = delivery.expect("error in consumer");
delivery
.ack(BasicAckOptions::default())
.await
.expect("ack");
}
}).detach();
let payload = b"Hello world!";
loop {
let confirm = channel_a
.basic_publish(
"",
"hello",
BasicPublishOptions::default(),
payload,
BasicProperties::default(),
)
.await?
.await?;
assert_eq!(confirm, Confirmation::NotRequested);
}
})
}
Dependencies
~4–25MB
~481K SLoC