2024-01-08 04:46:30 +00:00
|
|
|
use crate::QueueHandle;
|
|
|
|
use background_jobs_core::Job;
|
2020-04-23 18:16:56 +00:00
|
|
|
use std::time::Duration;
|
2024-01-11 03:11:45 +00:00
|
|
|
use tokio::time::{interval_at, Instant};
|
2019-05-28 00:23:25 +00:00
|
|
|
|
|
|
|
/// A type used to schedule recurring jobs.
|
|
|
|
///
|
|
|
|
/// ```rust,ignore
|
2020-03-21 03:24:31 +00:00
|
|
|
/// let server = create_server(storage);
|
|
|
|
/// server.every(Duration::from_secs(60 * 30), MyJob::new());
|
2019-05-28 00:23:25 +00:00
|
|
|
/// ```
|
2021-10-29 22:07:01 +00:00
|
|
|
pub(crate) async fn every<J>(spawner: QueueHandle, duration: Duration, job: J)
|
2019-05-28 00:23:25 +00:00
|
|
|
where
|
2024-01-08 04:46:30 +00:00
|
|
|
J: Job + Clone + Send,
|
2019-05-28 00:23:25 +00:00
|
|
|
{
|
2021-10-29 22:07:01 +00:00
|
|
|
let mut interval = interval_at(Instant::now(), duration);
|
2019-05-28 00:23:25 +00:00
|
|
|
|
2021-10-29 22:07:01 +00:00
|
|
|
loop {
|
|
|
|
interval.tick().await;
|
2019-05-28 00:23:25 +00:00
|
|
|
|
2021-10-29 22:07:01 +00:00
|
|
|
let job = job.clone();
|
|
|
|
if spawner.queue::<J>(job).await.is_err() {
|
2022-12-14 05:07:03 +00:00
|
|
|
tracing::error!("Failed to queue job: {}", J::NAME);
|
2020-03-21 02:31:03 +00:00
|
|
|
}
|
2021-10-29 22:07:01 +00:00
|
|
|
}
|
2019-05-28 00:23:25 +00:00
|
|
|
}
|