Crate actix_redis_jobs[][src]

actix-redis-jobs

Simple and reliable background processing for Rust using Actix and Redis

Getting Started

To get started, just add to Cargo.toml

[dependencies]
actix-redis-jobs = { version = "0.2.0-beta.1" }

Prerequisites

A running redis server is required. You can quickly use docker:

docker run --name some-redis -d redis

Usage

use actix::prelude::*;
use futures::future::BoxFuture;
use log::info;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use std::sync::Mutex;
struct MyData {
    counter: usize,
}
use actix_redis_jobs::{
    JobContext, JobHandler, JobResult, Producer, RedisConsumer, RedisStorage, ScheduleJob,
    WorkManager,
};
#[derive(Serialize, Deserialize, Message, Clone)]
#[rtype(result = "()")]
enum Math {
    Sum(isize, isize),
    Multiply(isize, isize),
}
impl JobHandler for Math {
    fn handle(&self, ctx: &JobContext) -> BoxFuture<JobResult> {
        let counter = ctx.data_opt::<Arc<Mutex<MyData>>>().unwrap();
        let mut data = counter.lock().unwrap();
        data.counter += 1;
        info!("Done like {} jobs", data.counter);
        let fut = async move {
            match self {
                Math::Sum(first, second) => {
                    info!(
                        "Sum result for {} and {} is {}",
                        first,
                        second,
                        first + second
                    );
                    JobResult::Result(Ok(()))
                }
                Math::Multiply(first, second) => {
                    info!(
                        "Multiply result for {} and {} is {}",
                        first,
                        second,
                        first * second
                    );
                    JobResult::Result(Ok(()))
                }
            }
        };
        Box::pin(fut)
    }
}
#[actix_rt::main]
async fn main() {
    std::env::set_var("RUST_LOG", "info");
    env_logger::init();
    let storage = RedisStorage::new("redis://127.0.0.1/");
    let producer = Producer::start(&storage, "math");
    let multiply = Math::Multiply(9, 8);
    producer.do_send(multiply); //Handled instantly
    let sum = Math::Sum(1, 2);
    let scheduled = ScheduleJob::new(sum).in_minutes(1); //Scheduled into the future
    producer.do_send(scheduled);
    let counter = Arc::new(Mutex::new(MyData { counter: 0 }));
    WorkManager::create(move |worker| {
        worker.consumer(
            RedisConsumer::<Math>::new(&storage, "math")
                .data(counter.clone()) //Actix ideas
                .workers(2),
        )
    })
    .run()
    .await;
}

Structs

Job
JobContext
Producer

Actix Scheduler queue actor.

PushJob

Actix message implements request Redis to push job

RedisConsumer
RedisStorage
ScheduleJob

Actix message implements request Redis to schedule job

WorkManager

Enums

JobResult
JobStatus

Status of pushing a job.

TaskError

Traits

Consumer
JobHandler