Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

How to Execute Background Tasks

Problem

You want to offload long-running work (such as sending emails, processing uploads, or generating reports) to an asynchronous background task queue.

Solution

Annotate an async task handler with #[task] from djangors_tasks. Enqueue tasks into the database queue with enqueue(), and run the background task consumer using Worker.

Code Example

#![allow(unused)]
fn main() {
use serde::{Deserialize, Serialize};
use djangors_tasks::{task, enqueue, Worker, TaskError};
use djangors_db::Database;

// 1. Define task payload struct deriving Serde
#[derive(Serialize, Deserialize, Debug)]
pub struct SendReportPayload {
    pub user_id: i64,
    pub report_name: String,
}

// 2. Define background task handler function
#[task]
pub async fn send_report_task(payload: SendReportPayload) -> Result<(), TaskError> {
    println!("Processing report '{}' for user ID {}", payload.report_name, payload.user_id);
    // Task execution logic here...
    Ok(())
}

// 3. Enqueue task from a request handler or service
pub async fn trigger_report_generation(db: &Database, user_id: i64) -> Result<i64, TaskError> {
    let payload = SendReportPayload {
        user_id,
        report_name: "Monthly Audit".to_string(),
    };
    
    // Enqueue task for immediate background execution
    let task_id = enqueue(db, "send_report_task", &payload).await?;
    Ok(task_id)
}

// 4. Run the worker loop in a background thread or service
pub async fn start_background_worker(db: Database) {
    let worker = Worker::new(db).with_poll_interval(std::time::Duration::from_secs(2));
    worker.run().await; // Loops continuously processing claimed tasks
}
}