armature_queue/lib.rs
1//! Job queue and background processing for Armature framework.
2//!
3//! Provides a robust job queue system with:
4//! - 📦 Redis-backed persistence
5//! - 🔄 Automatic retries with exponential backoff
6//! - ⭐ Job priorities
7//! - ⏰ Delayed/scheduled jobs
8//! - 💀 Dead letter queue
9//! - 📊 Job progress tracking
10//! - 🎯 Multiple queues
11//! - 👷 Worker pools
12//!
13//! ## Quick Start - Job Creation
14//!
15//! ```
16//! use armature_queue::{Job, JobData, JobPriority};
17//! use serde_json::json;
18//!
19//! let job = Job::new(
20//! "emails",
21//! "send_welcome",
22//! json!({"to": "user@example.com"})
23//! );
24//!
25//! assert_eq!(job.queue, "emails");
26//! assert_eq!(job.job_type, "send_welcome");
27//! assert_eq!(job.priority, JobPriority::Normal);
28//! ```
29//!
30//! ## Job Priorities
31//!
32//! ```
33//! use armature_queue::{Job, JobData, JobPriority};
34//! use serde_json::json;
35//!
36//! // Create high priority job
37//! let urgent = Job::new(
38//! "tasks",
39//! "urgent_task",
40//! json!({})
41//! ).with_priority(JobPriority::High);
42//!
43//! // Create low priority job
44//! let background = Job::new(
45//! "tasks",
46//! "cleanup",
47//! json!({})
48//! ).with_priority(JobPriority::Low);
49//!
50//! assert_eq!(urgent.priority, JobPriority::High);
51//! assert_eq!(background.priority, JobPriority::Low);
52//! assert!(urgent.priority > background.priority);
53//! ```
54//!
55//! ## Delayed Jobs
56//!
57//! ```
58//! use armature_queue::Job;
59//! use serde_json::json;
60//! use chrono::Duration;
61//!
62//! // Schedule job to run in 1 hour
63//! let scheduled = Job::new(
64//! "emails",
65//! "reminder",
66//! json!({"message": "Don't forget!"})
67//! ).schedule_after(Duration::hours(1));
68//!
69//! assert!(scheduled.scheduled_at.is_some());
70//! ```
71//!
72//! ## Queue Configuration
73//!
74//! ```
75//! use armature_queue::QueueConfig;
76//! use std::time::Duration;
77//!
78//! let config = QueueConfig::new("redis://localhost:6379", "emails")
79//! .with_key_prefix("myapp:queue:emails")
80//! .with_max_size(10000)
81//! .with_retention_time(Duration::from_secs(86400));
82//!
83//! assert_eq!(config.queue_name, "emails");
84//! assert_eq!(config.max_size, 10000);
85//! assert_eq!(config.retention_time, Duration::from_secs(86400));
86//! ```
87//!
88//! ## Complete Example
89//!
90//! ```no_run
91//! use armature_queue::*;
92//!
93//! #[tokio::main]
94//! async fn main() -> Result<(), QueueError> {
95//! // Create a queue
96//! let queue = Queue::new("redis://localhost:6379", "default").await?;
97//!
98//! // Enqueue a job
99//! let job_id = queue.enqueue(
100//! "send_email",
101//! serde_json::json!({
102//! "to": "user@example.com",
103//! "subject": "Hello"
104//! })
105//! ).await?;
106//!
107//! // Process jobs
108//! let mut worker = Worker::new(queue);
109//! worker.register_handler("send_email", |job| async move {
110//! // Send email logic
111//! Ok(())
112//! });
113//!
114//! worker.start().await?;
115//!
116//! Ok(())
117//! }
118//! ```
119
120pub mod error;
121pub mod job;
122pub mod queue;
123pub mod worker;
124
125pub use error::{QueueError, QueueResult};
126pub use job::{Job, JobData, JobId, JobPriority, JobState, JobStatus};
127pub use queue::{Queue, QueueConfig};
128pub use worker::{JobHandler, Worker, WorkerConfig};
129
130/// Re-export commonly used types
131pub mod prelude {
132 pub use crate::error::{QueueError, QueueResult};
133 pub use crate::job::{Job, JobData, JobId, JobPriority, JobState, JobStatus};
134 pub use crate::queue::{Queue, QueueConfig};
135 pub use crate::worker::{JobHandler, Worker, WorkerConfig};
136}