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}