scheduler/model/
schedule.rs1use super::CronSchedule;
2use chrono::{DateTime, Utc};
3use chrono_tz::{Asia::Shanghai, Tz};
4use std::time::Duration;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct StaggeredIntervalSchedule {
9 pub every: Duration,
10 pub seed: Option<String>,
11}
12
13impl StaggeredIntervalSchedule {
14 pub fn new(every: Duration) -> Self {
15 Self { every, seed: None }
16 }
17
18 pub fn with_seed(mut self, seed: impl Into<String>) -> Self {
19 self.seed = Some(seed.into());
20 self
21 }
22}
23
24#[derive(Debug, Clone, PartialEq, Eq)]
26pub struct GroupedIntervalSchedule {
27 pub every: Duration,
28 pub group_size: u32,
29 pub member_index: u32,
30 pub group_seed: Option<String>,
31}
32
33impl GroupedIntervalSchedule {
34 pub fn new(every: Duration, group_size: u32, member_index: u32) -> Self {
35 Self {
36 every,
37 group_size,
38 member_index,
39 group_seed: None,
40 }
41 }
42
43 pub fn with_group_seed(mut self, group_seed: impl Into<String>) -> Self {
44 self.group_seed = Some(group_seed.into());
45 self
46 }
47}
48
49#[derive(Debug, Clone, PartialEq, Eq)]
50pub enum Schedule {
51 Interval(Duration),
53 StaggeredInterval(StaggeredIntervalSchedule),
58 GroupedInterval(GroupedIntervalSchedule),
65 AtTimes(Vec<DateTime<Tz>>),
70 Cron(CronSchedule),
75}
76
77#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
78pub enum MissedRunPolicy {
79 Skip,
80 #[default]
81 CatchUpOnce,
82 ReplayAll,
83}
84
85#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
86pub enum OverlapPolicy {
87 #[default]
88 Forbid,
89 QueueOne,
90 AllowParallel,
91}
92
93#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
94pub enum TerminalStatePolicy {
95 #[default]
96 Retain,
97 Delete,
98}
99
100#[derive(Debug, Clone)]
101pub struct SchedulerConfig {
102 pub timezone: Tz,
108 pub history_limit: usize,
110 pub terminal_state_policy: TerminalStatePolicy,
113}
114
115impl Default for SchedulerConfig {
116 fn default() -> Self {
117 Self {
118 timezone: Shanghai,
119 history_limit: 32,
120 terminal_state_policy: TerminalStatePolicy::Retain,
121 }
122 }
123}
124
125impl Schedule {
126 pub fn staggered_interval(every: Duration) -> Self {
129 Self::StaggeredInterval(StaggeredIntervalSchedule::new(every))
130 }
131
132 pub fn staggered_interval_with_seed(every: Duration, seed: impl Into<String>) -> Self {
134 Self::StaggeredInterval(StaggeredIntervalSchedule::new(every).with_seed(seed))
135 }
136
137 pub fn grouped_interval(every: Duration, group_size: u32, member_index: u32) -> Self {
139 Self::GroupedInterval(GroupedIntervalSchedule::new(
140 every,
141 group_size,
142 member_index,
143 ))
144 }
145
146 pub fn grouped_interval_with_seed(
149 every: Duration,
150 group_size: u32,
151 member_index: u32,
152 group_seed: impl Into<String>,
153 ) -> Self {
154 Self::GroupedInterval(
155 GroupedIntervalSchedule::new(every, group_size, member_index)
156 .with_group_seed(group_seed),
157 )
158 }
159}
160
161pub(crate) fn utc_time(value: DateTime<Tz>) -> DateTime<Utc> {
162 value.with_timezone(&Utc)
163}