mirror of
https://github.com/perstarkse/minne.git
synced 2026-02-17 05:37:40 +01:00
104 lines
2.9 KiB
Rust
104 lines
2.9 KiB
Rust
|
|
use amqprs::{
|
|
callbacks::{DefaultChannelCallback, DefaultConnectionCallback},
|
|
channel::{
|
|
BasicConsumeArguments, BasicPublishArguments, QueueBindArguments, QueueDeclareArguments,
|
|
},
|
|
connection::{Connection, OpenConnectionArguments},
|
|
consumer::DefaultConsumer,
|
|
BasicProperties,
|
|
};
|
|
use tokio::time;
|
|
|
|
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
|
|
|
#[tokio::main(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn main() {
|
|
// construct a subscriber that prints formatted traces to stdout
|
|
// global subscriber with log level according to RUST_LOG
|
|
tracing_subscriber::registry()
|
|
.with(fmt::layer())
|
|
.with(EnvFilter::from_default_env())
|
|
.try_init()
|
|
.ok();
|
|
|
|
// open a connection to RabbitMQ server
|
|
let connection = Connection::open(&OpenConnectionArguments::new(
|
|
"localhost",
|
|
5672,
|
|
"user",
|
|
"bitnami",
|
|
))
|
|
.await
|
|
.unwrap();
|
|
connection
|
|
.register_callback(DefaultConnectionCallback)
|
|
.await
|
|
.unwrap();
|
|
|
|
// open a channel on the connection
|
|
let channel = connection.open_channel(None).await.unwrap();
|
|
channel
|
|
.register_callback(DefaultChannelCallback)
|
|
.await
|
|
.unwrap();
|
|
|
|
// declare a durable queue
|
|
let (queue_name, _, _) = channel
|
|
.queue_declare(QueueDeclareArguments::durable_client_named(
|
|
"amqprs.examples.basic",
|
|
))
|
|
.await
|
|
.unwrap()
|
|
.unwrap();
|
|
|
|
// bind the queue to exchange
|
|
let routing_key = "amqprs.example";
|
|
let exchange_name = "amq.topic";
|
|
channel
|
|
.queue_bind(QueueBindArguments::new(
|
|
&queue_name,
|
|
exchange_name,
|
|
routing_key,
|
|
))
|
|
.await
|
|
.unwrap();
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// start consumer with given name
|
|
let args = BasicConsumeArguments::new(&queue_name, "example_basic_pub_sub");
|
|
|
|
channel
|
|
.basic_consume(DefaultConsumer::new(args.no_ack), args)
|
|
.await
|
|
.unwrap();
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// publish message
|
|
let content = String::from(
|
|
r#"
|
|
{
|
|
"publisher": "example"
|
|
"data": "Hello, amqprs!"
|
|
}
|
|
"#,
|
|
)
|
|
.into_bytes();
|
|
|
|
// create arguments for basic_publish
|
|
let args = BasicPublishArguments::new(exchange_name, routing_key);
|
|
|
|
channel
|
|
.basic_publish(BasicProperties::default(), content, args)
|
|
.await
|
|
.unwrap();
|
|
|
|
// keep the `channel` and `connection` object from dropping before pub/sub is done.
|
|
// channel/connection will be closed when drop.
|
|
time::sleep(time::Duration::from_secs(1)).await;
|
|
// explicitly close
|
|
|
|
channel.close().await.unwrap();
|
|
connection.close().await.unwrap();
|
|
}
|