background-jobs/jobs-actix/src/every.rs
2021-02-03 16:32:56 -06:00

29 lines
742 B
Rust

use crate::{Job, QueueHandle};
use actix_rt::time::{interval_at, Instant};
use log::error;
use std::time::Duration;
/// A type used to schedule recurring jobs.
///
/// ```rust,ignore
/// let server = create_server(storage);
/// server.every(Duration::from_secs(60 * 30), MyJob::new());
/// ```
pub(crate) fn every<J>(spawner: &QueueHandle, duration: Duration, job: J)
where
J: Job + Clone + Send,
{
let spawner_clone = spawner.clone();
spawner.arbiter.spawn(async move {
let mut interval = interval_at(Instant::now(), duration);
loop {
interval.tick().await;
if spawner_clone.queue(job.clone()).is_err() {
error!("Failed to queue job");
}
}
});
}