use crate::Job;
use crate::runtime::{Runtime, SelectedRuntime};
use redis::aio::MultiplexedConnection;
use std::sync::atomic::AtomicBool;
use std::{marker::PhantomData, sync::Arc};
pub struct Task<T: Job> {
pub id: String,
pub payload: T,
}
pub struct Claimer<I: Job, DE, DF, DFut>
where
DF: Fn(I, usize) -> DFut,
DE: std::fmt::Display,
DFut: Future<Output = Result<(), DE>>,
{
pub(super) min_idle_time: usize,
pub(super) block_timeout: usize,
pub(super) max_concurrent_tasks: usize,
pub(super) max_retries: usize,
pub(super) dlq_worker: Option<Arc<DF>>,
pub(super) _marker: PhantomData<(I, DE, DFut)>,
}
pub struct ClaimerBuilder<I: Job, DE, DF, DFut>
where
DF: Fn(I, usize) -> DFut + 'static + Send + Sync,
DE: std::fmt::Display + Send + 'static,
DFut: Future<Output = Result<(), DE>> + Send,
{
pub(super) min_idle_time: usize,
pub(super) block_timeout: usize,
pub(super) max_concurrent_tasks: usize,
pub(super) max_retries: usize,
pub(super) dlq_worker: Option<Arc<DF>>,
pub(super) _marker: PhantomData<(I, DE, DFut)>,
}
pub struct Queue<I: Job, E, F, Fut, DE, DF, DFut>
where
F: Fn(I) -> Fut,
E: std::fmt::Display,
Fut: Future<Output = Result<(), E>>,
DF: Fn(I, usize) -> DFut,
DE: std::fmt::Display,
DFut: Future<Output = Result<(), DE>>,
{
pub name: String,
pub(super) consumer_group: String,
pub(super) consumer_id: String,
pub(super) block_timeout: usize,
pub(super) max_concurrent_tasks: usize,
pub(super) worker: Arc<F>,
pub(super) claimer: Option<Claimer<I, DE, DF, DFut>>,
pub(super) _marker: PhantomData<(I, Fut, E)>,
pub(super) conn: MultiplexedConnection,
pub(super) read_conn: MultiplexedConnection,
}
pub struct QueueBuilder<I, E, F, Fut, DE, DF, DFut>
where
I: Job,
F: Fn(I) -> Fut + 'static + Send + Sync,
E: std::fmt::Display + Send + 'static,
Fut: Future<Output = Result<(), E>> + Send,
DF: Fn(I, usize) -> DFut + 'static + Send + Sync,
DE: std::fmt::Display + Send + 'static,
DFut: Future<Output = Result<(), DE>> + Send,
{
pub(super) name: String,
pub(super) consumer_group: String,
pub(super) consumer_id: String,
pub(super) block_timeout: usize,
pub(super) max_concurrent_tasks: usize,
pub(super) worker: Arc<F>,
pub(super) claimer: Option<ClaimerBuilder<I, DE, DF, DFut>>,
pub(super) conn: MultiplexedConnection,
pub(super) read_conn: MultiplexedConnection,
pub(super) _marker: PhantomData<(I, Fut, E)>,
}
pub struct QueueHandle {
pub(super) shutdown: Arc<AtomicBool>,
pub(super) main_join: <SelectedRuntime as Runtime>::JoinHandle,
pub(super) claimer_join: Option<<SelectedRuntime as Runtime>::JoinHandle>,
}