Skip to main content

azoth_scheduler/
lib.rs

1//! Azoth Scheduler
2//!
3//! A cron-like task scheduling system for Azoth projects.
4//!
5//! # Overview
6//!
7//! The scheduler provides task scheduling capabilities with:
8//! - Cron expressions for recurring tasks
9//! - Interval-based scheduling
10//! - One-time tasks at specific times
11//! - Immediate execution (job queue)
12//! - Configurable concurrency
13//! - Automatic retries with exponential backoff
14//!
15//! # Architecture
16//!
17//! The scheduler follows Azoth's event-sourcing architecture:
18//!
19//! 1. **Schedule Events**: Tasks are scheduled by writing events to the canonical store
20//! 2. **Projection**: A SQLite projection tracks task state and next run times
21//! 3. **Scheduler Loop**: Continuously polls for due tasks
22//! 4. **Task Handlers**: Execute tasks and produce events
23//! 5. **Event Handlers**: Process task result events
24//!
25//! # Example
26//!
27//! ```ignore
28//! use azoth_scheduler::prelude::*;
29//! use std::sync::Arc;
30//!
31//! // Define a task handler
32//! struct ReportHandler;
33//!
34//! impl TaskHandler for ReportHandler {
35//!     fn task_type(&self) -> &str {
36//!         "generate_report"
37//!     }
38//!
39//!     fn execute(&self, ctx: &TaskContext, payload: &[u8]) -> Result<TaskEvent> {
40//!         // Execute task logic
41//!         Ok(TaskEvent {
42//!             event_type: "report_generated".to_string(),
43//!             payload: vec![],
44//!         })
45//!     }
46//! }
47//!
48//! #[tokio::main]
49//! async fn main() -> Result<()> {
50//!     let db = Arc::new(AzothDb::open("./data")?);
51//!     let conn = Arc::new(Connection::open("./projection.db")?);
52//!
53//!     // Create scheduler
54//!     let scheduler = Scheduler::builder(db.clone())
55//!         .with_task_handler(ReportHandler)
56//!         .with_poll_interval(Duration::from_secs(1))
57//!         .build(conn)?;
58//!
59//!     // Schedule a task
60//!     scheduler.schedule_task(
61//!         ScheduleTaskRequest::builder("daily-report")
62//!             .task_type("generate_report")
63//!             .cron("0 0 * * *")  // Daily at midnight
64//!             .payload(vec![])
65//!             .build()?
66//!     )?;
67//!
68//!     // Run scheduler
69//!     scheduler.run().await?;
70//!     Ok(())
71//! }
72//! ```
73
74pub mod config;
75pub mod error;
76pub mod event_applier;
77pub mod events;
78pub mod execution;
79pub mod projection;
80pub mod schedule;
81pub mod scheduler;
82pub mod task_handler;
83
84pub mod prelude;
85
86// Re-export main types
87pub use config::SchedulerConfig;
88pub use error::{Result, SchedulerError};
89pub use event_applier::SchedulerEventApplier;
90pub use events::SchedulerEvent;
91pub use projection::{DueTask, ScheduleProjection, ScheduledTask, TaskFilter};
92pub use schedule::Schedule;
93pub use scheduler::{ScheduleTaskRequest, ScheduleTaskRequestBuilder, Scheduler, SchedulerBuilder};
94pub use task_handler::{TaskContext, TaskEvent, TaskHandler, TaskHandlerRegistry};