use asynq::client::Client;
use asynq::scheduler::{PeriodicTask, Scheduler};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct EmailPayload {
to: String,
subject: String,
body: String,
}
#[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 PostgreSQL URL: {database_url}");
let client = std::sync::Arc::new(Client::new_with_postgres(&database_url).await?);
println!("✅ Connected to PostgreSQL");
let scheduler = std::sync::Arc::new(Scheduler::new(client.clone(), None).await?);
let scheduler_id = "postgres_demo_scheduler";
let email_payload = EmailPayload {
to: "admin@example.com".to_string(),
subject: "Daily Report".to_string(),
body: "Here is your daily report!".to_string(),
};
let email_payload_bin = serde_json::to_vec(&email_payload)?;
let task = PeriodicTask::new(
"email:send".to_string(),
"* * * * * *".to_string(), email_payload_bin,
"default".to_string(),
)?;
let _entry_id1 = scheduler.register(task, "default").await?;
println!("📝 Registered periodic email task");
let report_payload = serde_json::to_vec(&serde_json::json!({
"type": "system_report"
}))?;
let report_task = PeriodicTask::new(
"report:generate".to_string(),
"*/5 * * * * *".to_string(), report_payload,
"default".to_string(),
)?;
let _entry_id2 = scheduler.register(report_task, "default").await?;
println!("📝 Registered periodic report task");
scheduler.start().await;
println!("🚀 Scheduler started!");
let entries = scheduler.list_entries(scheduler_id).await;
println!("📋 Registered scheduler entries: {}", entries.len());
for entry in &entries {
println!(" - Task: {} (cron: {})", entry.task_type, entry.spec);
}
println!("⏰ Scheduler will run for 30 seconds...");
tokio::time::sleep(std::time::Duration::from_secs(30)).await;
let events = scheduler.list_events(10).await;
println!("📊 Scheduler events: {}", events.len());
for event in &events {
println!(" - Enqueued task: {}", event.task_id);
}
scheduler.stop().await;
println!("🛑 Scheduler stopped");
Ok(())
}