backyard-core 0.1.0

Core traits and types for the Backyard async job queue
Documentation

Backyard Core

Core traits and types for the Backyard async job queue.

This crate provides the fundamental abstractions that make Backyard backend-agnostic:

  • [Job] trait for defining background jobs
  • [Queue] trait for implementing backends (SQLite, Redis, etc.)
  • [WorkerPool] for processing jobs with Tokio

Quick Start

Define a job by implementing [Job]:

use backyard_core::{Job, JobContext, Result};
use async_trait::async_trait;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct SendEmail {
    to: String,
}

#[async_trait]
impl Job for SendEmail {
    const NAME: &'static str = "SendEmail";

    async fn execute(self, ctx: &JobContext) -> Result<()> {
        println!("Sending email to {}", self.to);
        Ok(())
    }
}

Then use with a backend like backyard-sqlite:

use backyard_sqlite::SqliteQueue;
use backyard_core::WorkerBuilder;

#[tokio::main]
async fn main() -> Result<()> {
    let queue = SqliteQueue::new(Default::default()).await?;

    // Enqueue a job
    let job = SendEmail { to: "user@example.com".into() };
    let payload = serde_json::to_vec(&job)?;
    let req = backyard_core::queue::EnqueueRequest {
        job_type: SendEmail::NAME.to_string(),
        queue: "default".to_string(),
        payload,
        max_retries: 3,
        priority: 0,
        scheduled_at: chrono::Utc::now(),
    };
    queue.push(req).await?;

    // Run the worker
    WorkerBuilder::new(queue)
        .concurrency(10)
        .run()
        .await?;

    Ok(())
}