use asynq::{error::Result, task::Task, task_handler};
#[task_handler("email:*")]
fn handle_email_tasks(task: Task) -> Result<()> {
println!("📧 [Email Handler] Processing: {}", task.get_type());
println!(
" Payload: {:?}",
String::from_utf8_lossy(task.get_payload())
);
println!(" ✓ Handled by email:* pattern");
Ok(())
}
#[task_handler("sms:*")]
fn handle_sms_tasks(task: Task) -> Result<()> {
println!("📱 [SMS Handler] Processing: {}", task.get_type());
println!(
" Payload: {:?}",
String::from_utf8_lossy(task.get_payload())
);
println!(" ✓ Handled by sms:* pattern");
Ok(())
}
#[task_handler("*:urgent")]
fn handle_urgent_tasks(task: Task) -> Result<()> {
println!("🚨 [Urgent Handler] Processing: {}", task.get_type());
println!(
" Payload: {:?}",
String::from_utf8_lossy(task.get_payload())
);
println!(" ✓ Handled by *:urgent pattern");
Ok(())
}
#[task_handler("notification:*:complete")]
fn handle_notification_complete(task: Task) -> Result<()> {
println!("✅ [Notification Complete] Processing: {}", task.get_type());
println!(
" Payload: {:?}",
String::from_utf8_lossy(task.get_payload())
);
println!(" ✓ Handled by notification:*:complete pattern");
Ok(())
}
#[task_handler("*")]
fn handle_fallback(task: Task) -> Result<()> {
println!("🔄 [Fallback Handler] Processing: {}", task.get_type());
println!(
" Payload: {:?}",
String::from_utf8_lossy(task.get_payload())
);
println!(" ✓ Handled by * (catch-all) pattern");
Ok(())
}
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
println!("╔══════════════════════════════════════════════════════════════╗");
println!("║ Pattern Matching Example - Task Router ║");
println!("╚══════════════════════════════════════════════════════════════╝");
println!();
let redis_config = asynq::backend::RedisConnectionType::single("redis://127.0.0.1:6379")?;
let mut queues = std::collections::HashMap::new();
queues.insert("default".to_string(), 5);
queues.insert("urgent".to_string(), 10);
let server_config = asynq::config::ServerConfig::new()
.concurrency(2)
.queues(queues)
.strict_priority(false)
.task_check_interval(std::time::Duration::from_secs(1))
.shutdown_timeout(std::time::Duration::from_secs(5));
println!("⚙️ Server Configuration:");
println!(" • Concurrency: 2 workers");
println!(" • Queues: default (5), urgent (10)");
println!();
println!("📋 Registering task handlers with patterns...");
let mut mux = asynq::serve_mux::ServeMux::new();
asynq::register_handlers!(
mux,
handle_urgent_tasks, handle_notification_complete, handle_email_tasks, handle_sms_tasks, handle_fallback );
println!(" ✓ Registered patterns:");
println!(" - *:urgent (all urgent tasks)");
println!(" - notification:*:complete (notification completion tasks)");
println!(" - email:* (all email tasks)");
println!(" - sms:* (all SMS tasks)");
println!(" - * (catch-all fallback)");
println!();
println!("🚀 Starting server...");
let mut server = asynq::server::ServerBuilder::new()
.redis_config(redis_config)
.server_config(server_config)
.build()
.await?;
println!(" ✓ Server started successfully");
println!();
println!("════════════════════════════════════════════════════════════════");
println!("Server is running. Send tasks to see pattern matching in action!");
println!();
println!("Example tasks to enqueue from another terminal:");
println!(" - email:send → Matches 'email:*'");
println!(" - email:deliver → Matches 'email:*'");
println!(" - sms:send → Matches 'sms:*'");
println!(" - payment:urgent → Matches '*:urgent'");
println!(" - notification:email:complete → Matches 'notification:*:complete'");
println!(" - report:generate → Matches '*' (catch-all)");
println!();
println!("Press Ctrl+C to stop the server");
println!("════════════════════════════════════════════════════════════════");
server.run(mux).await?;
println!();
println!("👋 Server shutdown complete");
Ok(())
}