use ri::queue::{RiQueueModule, RiQueueConfig, RiQueueManager, RiQueueMessage, RiRetryPolicy, RiDeadLetterConfig};
use ri::core::RiResult;
fn main() -> RiResult<()> {
println!("=== Ri Message Queue Module Example ===\n");
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let queue_config = RiQueueConfig::redis()
.with_host("localhost")
.with_port(6379)
.with_password(None)
.with_db(0)
.build();
println!("1. Creating queue module...");
let queue_module = RiQueueModule::new(queue_config).await?;
let manager = queue_module.get_manager();
println!(" Queue module initialized\n");
println!("2. Creating 'orders' queue...");
manager.create_queue("orders", None).await?;
println!(" Queue 'orders' created\n");
println!("3. Creating 'notifications' queue with dead letter queue...");
let dlq_config = RiDeadLetterConfig::new()
.with_queue_name("notifications_dlq")
.with_max_retries(3)
.with_ttl_secs(86400)
.build();
manager.create_queue("notifications", Some(dlq_config)).await?;
println!(" Queue 'notifications' created with DLQ\n");
println!("4. Publishing messages to 'orders' queue...");
for i in 1..=5 {
let message = RiQueueMessage::new(
format!("order-{}", i),
serde_json::json!({
"order_id": i,
"product": format!("Product {}", i),
"quantity": i * 2,
"price": 29.99 * i as f64
}),
).with_priority(if i == 1 { 10 } else { 5 });
manager.publish("orders", message).await?;
println!(" Published order #{}", i);
}
println!();
println!("5. Publishing notification messages...");
let notifications = vec![
("welcome", "Welcome to our service!"),
("promo", "Special discount available!"),
("alert", "Your account needs attention"),
];
for (key, content) in ¬ifications {
let message = RiQueueMessage::new(
key.to_string(),
serde_json::json!({
"type": key,
"content": content,
"sent_at": chrono::Utc::now().to_rfc3339()
}),
);
manager.publish("notifications", message).await?;
println!(" Published notification: {}", key);
}
println!();
println!("6. Consuming messages from 'orders' queue...");
let mut order_count = 0;
while order_count < 3 {
if let Some(msg) = manager.consume("orders", None).await? {
order_count += 1;
println!(" Received order #{}: id={}, product={}, quantity={}",
order_count,
msg.id(),
msg.payload().get("product").unwrap(),
msg.payload().get("quantity").unwrap()
);
manager.ack("orders", msg.id()).await?;
println!(" Message acknowledged\n");
}
}
println!("7. Peeking at next order message...");
if let Some(msg) = manager.peek("orders").await? {
println!(" Next message: id={}, payload={}\n", msg.id(), msg.payload());
}
println!("8. Getting queue statistics...");
let orders_stats = manager.get_stats("orders").await?;
println!(" 'orders' queue stats:");
println!(" - Messages in queue: {}", orders_stats.message_count());
println!(" - Messages published: {}", orders_stats.published_count());
println!(" - Messages consumed: {}", orders_stats.consumed_count());
println!();
let notifications_stats = manager.get_stats("notifications").await?;
println!(" 'notifications' queue stats:");
println!(" - Messages in queue: {}", notifications_stats.message_count());
println!(" - Dead letter count: {}\n", notifications_stats.dead_letter_count());
println!("9. Setting up retry policy for 'orders'...");
let retry_policy = RiRetryPolicy::new()
.with_max_retries(3)
.with_initial_delay_ms(1000)
.with_multiplier(2.0)
.with_max_delay_ms(30000)
.build();
manager.set_retry_policy("orders", retry_policy).await?;
println!(" Retry policy configured\n");
println!("10. Listing all queues...");
let queues = manager.list_queues().await?;
println!(" Available queues:");
for queue in &queues {
let stats = manager.get_stats(queue).await?;
println!(" - {}: {} messages", queue, stats.message_count());
}
println!();
println!("11. Cleaning up (deleting test queues)...");
manager.delete_queue("orders", true).await?;
manager.delete_queue("notifications", true).await?;
println!(" Test queues deleted\n");
println!("=== Message Queue Example Completed ===");
Ok::<(), RiError>(())
})?
}