use asynq::client::Client;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct EmailPayload {
to: String,
subject: String,
body: String,
}
#[derive(Serialize, Deserialize)]
struct ImageResizePayload {
src_url: String,
width: u32,
height: u32,
}
#[cfg(not(feature = "postgres"))]
fn main() {}
#[cfg(feature = "postgres")]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
let database_url = std::env::var("DATABASE_URL")
.unwrap_or_else(|_| "postgres://postgres:postgres@localhost:5432/asynq".to_string());
println!("🔗 Using PostgresSQL URL: {database_url}");
let client = Client::new_with_postgres(&database_url).await?;
println!("✅ Connected to PostgresSQL");
let email_payload = EmailPayload {
to: "user@example.com".to_string(),
subject: "Welcome!".to_string(),
body: "Welcome to our service!".to_string(),
};
let email_payload_bin = serde_json::to_vec(&email_payload)?;
let email_task = asynq::task::Task::new("email:send", &email_payload_bin).unwrap();
match client.enqueue(email_task).await {
Ok(task_info) => {
println!("📧 Email task enqueued: ID = {}", task_info.id);
}
Err(e) => {
println!("❌ Failed to enqueue email task: {e}");
}
}
let image_payload = ImageResizePayload {
src_url: "https://example.com/image.jpg".to_string(),
width: 800,
height: 600,
};
let image_payload_bin = serde_json::to_vec(&image_payload)?;
let image_task = asynq::task::Task::new("image:resize", &image_payload_bin)
.unwrap()
.with_queue("image_processing")
.with_max_retry(5)
.with_timeout(std::time::Duration::from_secs(300));
match client.enqueue(image_task).await {
Ok(task_info) => {
println!("🖼️ Image task enqueued: ID = {}", task_info.id);
}
Err(e) => {
println!("❌ Failed to enqueue image task: {e}");
}
}
let delayed_email_bin = serde_json::to_vec(&email_payload)?;
let delayed_email = asynq::task::Task::new("email:reminder", &delayed_email_bin).unwrap();
let process_at = std::time::SystemTime::now()
.checked_add(std::time::Duration::from_secs(30))
.unwrap();
match client.schedule(delayed_email, process_at).await {
Ok(task_info) => {
println!("⏰ Delayed email task scheduled: ID = {}", task_info.id);
}
Err(e) => {
println!("❌ Failed to schedule delayed task: {e}");
}
}
let unique_payload_bin = serde_json::to_vec(&serde_json::json!({"date": "2023-01-01"}))?;
let unique_task = asynq::task::Task::new("report:daily", &unique_payload_bin).unwrap();
match client
.enqueue_unique(unique_task, std::time::Duration::from_secs(3600))
.await
{
Ok(task_info) => {
println!("🔒 Unique task enqueued: ID = {}", task_info.id);
}
Err(e) => {
println!("❌ Failed to enqueue unique task: {e}");
}
}
for i in 1..=5 {
let batch_payload_bin = serde_json::to_vec(&serde_json::json!({"item": i}))?;
let batch_task = asynq::task::Task::new("batch:process", &batch_payload_bin).unwrap();
match client.add_to_group(batch_task, "daily_batch").await {
Ok(task_info) => {
println!("📦 Batch task {} added to group: ID = {}", i, task_info.id);
}
Err(e) => {
println!("❌ Failed to add batch task {i} to group: {e}");
}
}
}
let group_payload_bin = serde_json::to_vec(&serde_json::json!({"priority": "high"}))?;
let group_task = asynq::task::Task::new("group:process", &group_payload_bin).unwrap();
match client
.add_to_group_unique(
group_task,
"priority_group",
std::time::Duration::from_secs(3600),
)
.await
{
Ok(task_info) => {
println!("🔒 Unique group task added: ID = {}", task_info.id);
}
Err(e) => {
println!("❌ Failed to add unique group task: {e}");
}
}
client.close().await?;
println!("\n✅ All tasks have been enqueued successfully!");
Ok(())
}