use crate::job::{Job, JobOptions, JobResult, JobStatus};
use crate::queue::Queue;
use crate::worker::{Worker, WorkerConfig};
use crate::TaskConfig;
use std::sync::Arc;
pub struct BaseQueue {
pub name: String,
pub prefix: String,
pub task_config: TaskConfig,
pub queue: Arc<Queue>,
pub worker: Option<Worker>,
}
impl BaseQueue {
pub async fn new(name: &str, config: TaskConfig) -> JobResult<Self> {
let queue = Queue::new(name, &config.prefix, &config.redis_url).await?;
let worker_cfg = WorkerConfig {
concurrency: config.concurrency,
..Default::default()
};
let worker = Worker::new(queue.clone(), worker_cfg);
Ok(Self {
name: name.to_string(),
prefix: config.prefix.clone(),
task_config: config,
queue: Arc::new(queue),
worker: Some(worker),
})
}
pub async fn producer_only(name: &str, config: TaskConfig) -> JobResult<Self> {
let queue = Queue::new(name, &config.prefix, &config.redis_url).await?;
Ok(Self {
name: name.to_string(),
prefix: config.prefix.clone(),
task_config: config,
queue: Arc::new(queue),
worker: None,
})
}
pub async fn start_worker(&self) {
if let Some(worker) = &self.worker {
worker.start().await;
}
}
pub fn stop_worker(&self) {
if let Some(worker) = &self.worker {
worker.stop();
}
}
pub async fn add(
&self,
name: &str,
data: serde_json::Value,
options: JobOptions,
) -> JobResult<Job> {
self.queue.add(name, data, options).await
}
pub async fn add_bulk(
&self,
jobs: Vec<(String, serde_json::Value, JobOptions)>,
) -> JobResult<Vec<Job>> {
self.queue.add_bulk(jobs).await
}
pub async fn pause(&self) -> JobResult<()> {
self.queue.pause().await
}
pub async fn resume(&self) -> JobResult<()> {
self.queue.resume().await
}
pub async fn is_paused(&self) -> JobResult<bool> {
self.queue.is_paused().await
}
pub async fn count(&self, status: JobStatus) -> JobResult<u64> {
self.queue.count(status).await
}
pub async fn obliterate(&self) -> JobResult<()> {
self.queue.obliterate().await
}
}