Skip to content

Commit 25377e3

Browse files
committed
Add public function perform_at() for Client
1 parent 10c1e4e commit 25377e3

File tree

3 files changed

+63
-9
lines changed

3 files changed

+63
-9
lines changed

README.md

+11
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@ match client.perform_in(interval, job) {
6262
println!("Sidekiq push failed: {}", err);
6363
},
6464
}
65+
66+
// scheduled-jobs (perform_at)
67+
let job = Job::new(class, vec![sidekiq::Value::Null], Default::default());
68+
let now: DateTime<Local> = Local::now();
69+
let start_at = now + Duration::hours(1);
70+
match client.perform_at(start_at, job) {
71+
Ok(_) => {},
72+
Err(err) => {
73+
println!("Sidekiq push failed: {}", err);
74+
},
75+
}
6576
```
6677

6778
## REFERENCES

src/sidekiq/mod.rs

+22-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rand::{thread_rng, Rng};
1010
use serde::ser::SerializeStruct;
1111
use serde::{Serialize, Serializer};
1212

13-
use chrono::{Duration, Local};
13+
use chrono::{DateTime, Duration, Local};
1414

1515
const REDIS_URL_ENV: &str = "REDIS_URL";
1616
const REDIS_URL_DEFAULT: &str = "redis://127.0.0.1/";
@@ -201,16 +201,16 @@ impl Client {
201201
}
202202
}
203203

204-
fn calc_at(&self, interval: Duration) -> Option<f64> {
204+
fn calc_at(&self, target_millsec_number: f64) -> Option<f64> {
205205
let div: f64 = 1_000_f64;
206-
let maximum_interval: f64 = 1_000_000_000_f64;
207-
let interval_millsec: f64 = interval.num_milliseconds() as f64 / div;
206+
let maximum_target: f64 = 1_000_000_000_f64;
207+
let target_millsec: f64 = target_millsec_number / div;
208208
let now_millisec: f64 = Local::now().timestamp_millis() as f64 / div;
209209

210-
let start_at: f64 = if interval_millsec < maximum_interval {
211-
now_millisec + interval_millsec
210+
let start_at: f64 = if target_millsec < maximum_target {
211+
now_millisec + target_millsec
212212
} else {
213-
interval_millsec
213+
target_millsec
214214
};
215215

216216
if start_at <= now_millisec {
@@ -220,8 +220,22 @@ impl Client {
220220
}
221221
}
222222

223+
fn convert_duration_to_millsec(&self, interval: Duration) -> Option<f64> {
224+
let interval_millsec: f64 = interval.num_milliseconds() as f64;
225+
self.calc_at(interval_millsec)
226+
}
227+
228+
fn convert_datetime_to_millsec(&self, datetime: DateTime<Local>) -> Option<f64> {
229+
let timestamp_millsec: f64 = datetime.timestamp_millis() as f64;
230+
self.calc_at(timestamp_millsec)
231+
}
232+
223233
pub fn perform_in(&self, interval: Duration, job: Job) -> Result<(), ClientError> {
224-
self.raw_push(&[job], self.calc_at(interval))
234+
self.raw_push(&[job], self.convert_duration_to_millsec(interval))
235+
}
236+
237+
pub fn perform_at(&self, local_datetime: DateTime<Local>, job: Job) -> Result<(), ClientError> {
238+
self.raw_push(&[job], self.convert_datetime_to_millsec(local_datetime))
225239
}
226240

227241
pub fn push(&self, job: Job) -> Result<(), ClientError> {

tests/lib.rs

+30-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::time::{SystemTime, UNIX_EPOCH};
88
use serde_json::value::Value;
99
use sidekiq::{create_redis_pool, Client, ClientOpts, Job};
1010

11-
use chrono::Duration;
11+
use chrono::{DateTime, Duration, Local};
1212

1313
fn args() -> Vec<Value> {
1414
let value = json!({
@@ -111,3 +111,32 @@ fn test_client_perform_in() {
111111
}
112112
}
113113
}
114+
115+
#[test]
116+
fn test_client_perform_at() {
117+
let class = "MyClass".to_string();
118+
let job = Job::new(class, args(), Default::default());
119+
let client = get_client();
120+
let now: DateTime<Local> = Local::now();
121+
let start_at = now + Duration::hours(1);
122+
match client.perform_at(start_at, job) {
123+
Ok(_) => {}
124+
Err(err) => {
125+
println!("Sidekiq push failed: {}", err);
126+
unreachable!()
127+
}
128+
}
129+
130+
let class = "MyClass".to_string();
131+
let job = Job::new(class, args(), Default::default());
132+
let client = get_client();
133+
let now: DateTime<Local> = Local::now();
134+
let start_datetime = now + Duration::hours(0);
135+
match client.perform_at(start_datetime, job) {
136+
Ok(_) => {}
137+
Err(err) => {
138+
println!("Sidekiq push failed: {}", err);
139+
unreachable!()
140+
}
141+
}
142+
}

0 commit comments

Comments
 (0)