use backbone_queue::{
QueueService,
sqs::SqsQueueBuilder,
types::{QueueMessage, QueuePriority}
};
use std::collections::HashMap;
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
println!("🚀 AWS SQS Queue Examples");
println!("=========================");
let queue_url = std::env::var("SQS_QUEUE_URL")
.unwrap_or_else(|_| "https://sqs.us-east-1.amazonaws.com/123456789012/test-queue".to_string());
let region = std::env::var("AWS_REGION")
.unwrap_or_else(|_| "us-east-1".to_string());
println!("\n📬 Example 1: Basic SQS Queue Operations");
println!("----------------------------------------");
println!("📡 Creating SQS queue connection...");
let queue = SqsQueueBuilder::new()
.queue_url(&queue_url)
.region(®ion)
.visibility_timeout(30)
.wait_time_seconds(5)
.build()
.await?;
println!("✅ SQS queue connection established");
if queue.test_connection().await? {
println!("✅ SQS connection test successful");
} else {
println!("⚠️ SQS connection test failed (queue might not exist)");
}
let message = QueueMessage::builder()
.payload("Hello from SQS Queue!")
.priority(QueuePriority::Normal)
.build();
println!("📤 Enqueuing message: {}", message.payload);
match queue.enqueue(message.clone()).await {
Ok(message_id) => {
println!("✅ Message enqueued successfully: {}", message_id);
}
Err(e) => {
println!("⚠️ Failed to enqueue message: {}", e);
println!("💡 Make sure the SQS queue exists and you have proper permissions");
}
}
match queue.get_stats().await {
Ok(stats) => {
println!("📊 Queue Statistics:");
println!(" - Visible messages: {}", stats.visible_messages);
println!(" - Invisible messages: {}", stats.invisible_messages);
println!(" - Total messages: {}", stats.total_messages);
}
Err(e) => {
println!("⚠️ Failed to get statistics: {}", e);
}
}
println!("\n🏆 Example 2: Priority Messages with Attributes");
println!("--------------------------------------------");
let priority_messages = vec![
QueueMessage::builder()
.payload("Low priority notification")
.priority(QueuePriority::Low)
.build(),
QueueMessage::builder()
.payload("High priority alert")
.priority(QueuePriority::High)
.build(),
QueueMessage::builder()
.payload("Critical emergency response")
.priority(QueuePriority::Critical)
.build(),
];
for message in &priority_messages {
println!("📤 Attempting to enqueue: {} ({})", message.payload, message.priority);
match queue.enqueue(message.clone()).await {
Ok(id) => println!("✅ Enqueued: {}", id),
Err(e) => println!("❌ Failed: {}", e),
}
}
println!("\n🏷️ Example 3: Messages with Custom Attributes");
println!("--------------------------------------------");
let mut attributes = HashMap::new();
attributes.insert("source_system".to_string(), "payment_service".to_string());
attributes.insert("transaction_id".to_string(), "txn_123456".to_string());
attributes.insert("customer_tier".to_string(), "premium".to_string());
attributes.insert("priority_level".to_string(), "urgent".to_string());
let attributed_message = QueueMessage::builder()
.payload("Process high-value transaction")
.priority(QueuePriority::High)
.attributes(attributes)
.delay(10) .expires_in(3600) .build();
println!("📤 Enqueuing message with custom attributes...");
match queue.enqueue(attributed_message.clone()).await {
Ok(id) => println!("✅ Message with attributes enqueued: {}", id),
Err(e) => println!("❌ Failed to enqueue attributed message: {}", e),
}
println!("\n📦 Example 4: Batch Operations");
println!("----------------------------");
let mut batch_messages = Vec::new();
for i in 1..=5 {
let mut attrs = HashMap::new();
attrs.insert("batch_index".to_string(), i.to_string());
batch_messages.push(QueueMessage::builder()
.payload(format!("Batch processing item {}", i))
.priority(if i % 2 == 0 { QueuePriority::High } else { QueuePriority::Normal })
.attributes(attrs)
.build());
}
println!("📤 Attempting to enqueue {} messages in batch...", batch_messages.len());
match queue.enqueue_batch(batch_messages).await {
Ok(message_ids) => {
println!("✅ Batch enqueue successful: {} messages", message_ids.len());
println!("📋 Message IDs: {:?}", message_ids);
}
Err(e) => {
println!("❌ Batch enqueue failed: {}", e);
}
}
println!("\n🔄 Example 5: FIFO Queue Operations");
println!("---------------------------------");
let fifo_queue_url = queue_url.replace("/test-queue", "/test-queue.fifo");
let fifo_queue = SqsQueueBuilder::new()
.queue_url(&fifo_queue_url)
.region(®ion)
.build()
.await;
match fifo_queue {
Ok(queue) => {
println!("✅ FIFO queue connection established");
let fifo_messages = vec![
QueueMessage::builder()
.payload("First task in sequence")
.message_group_id("workflow-1")
.message_deduplication_id("task-1")
.build(),
QueueMessage::builder()
.payload("Second task in sequence")
.message_group_id("workflow-1")
.message_deduplication_id("task-2")
.build(),
QueueMessage::builder()
.payload("Third task in sequence")
.message_group_id("workflow-1")
.message_deduplication_id("task-3")
.build(),
];
for message in &fifo_messages {
println!("📤 Enqueuing FIFO message: {}", message.payload);
match queue.enqueue(message.clone()).await {
Ok(id) => println!("✅ FIFO message enqueued: {}", id),
Err(e) => println!("❌ FIFO enqueue failed: {}", e),
}
}
}
Err(e) => {
println!("⚠️ FIFO queue setup failed: {}", e);
println!("💡 FIFO queues require .fifo suffix and proper AWS configuration");
}
}
println!("\n🛡️ Example 6: Error Handling and Recovery");
println!("--------------------------------------");
let invalid_message = QueueMessage::builder()
.id("") .payload("Invalid message")
.build();
println!("📤 Attempting to enqueue invalid message...");
match queue.enqueue(invalid_message).await {
Ok(_) => println!("⚠️ Invalid message was accepted (unexpected)"),
Err(e) => println!("✅ Invalid message properly rejected: {}", e),
}
println!("\n🏥 Example 7: Health Monitoring");
println!("----------------------------");
let health = queue.health_check().await?;
println!("🏥 SQS Queue Health:");
println!(" - Status: {:?}", health.status);
println!(" - Queue size: {}", health.queue_size);
println!(" - Error rate: {:.2}%", health.error_rate * 100.0);
println!(" - Checked at: {}", health.checked_at);
for (key, value) in &health.details {
println!(" - {}: {}", key, value);
}
println!("\n📊 Example 8: Queue Size Monitoring");
println!("---------------------------------");
let size = queue.size().await?;
let is_empty = queue.is_empty().await?;
println!("📊 Current Queue Status:");
println!(" - Size: {} messages", size);
println!(" - Is Empty: {}", is_empty);
if !is_empty {
println!("💡 Queue has messages ready for processing");
}
println!("\n✅ Example 9: Configuration Validation");
println!("------------------------------------");
let validation_result = queue.validate_config().await?;
println!("✅ Configuration validation: {}", validation_result);
println!("\n📋 SQS Queue Examples Summary");
println!("==============================");
println!("✅ Basic SQS operations demonstrated");
println!("✅ Priority message handling shown");
println!("✅ Custom attributes usage illustrated");
println!("✅ Batch operations attempted");
println!("✅ FIFO queue setup explored");
println!("✅ Error handling patterns shown");
println!("✅ Health monitoring performed");
println!("✅ Configuration validation completed");
println!("\n💡 Important Notes:");
println!("- Ensure AWS credentials are properly configured");
println!("- SQS queues must exist before running these examples");
println!("- FIFO queues require .fifo suffix in queue URL");
println!("- Some operations might fail due to AWS permissions");
println!("- Check AWS IAM policies for required SQS permissions");
println!("\n🎉 SQS Queue Examples completed!");
Ok(())
}