quartz.rs
Minimalist scheduling library for Rust
Example
use std::{thread, time::Duration};
use std::sync::{Arc, atomic::{AtomicUsize, Ordering}};
use reqwest;
struct MyTask(Arc<AtomicUsize>);
struct MyWeather;
struct CustomTrigger {
interval: Duration,
ref_count: std::cell::RefCell<i64>,
}
impl quartz_sched::Job for Box<MyTask> {
fn execute(&self, engine: Option<quartz_sched::SchedulerHandle>) {
println!("[+] Executing 'MyTask'");
if self.0.clone().fetch_add(1, Ordering::SeqCst) > 10 {
println!("[+] Reached count 10");
self.0.clone().store(1, Ordering::SeqCst);
engine.unwrap().schedule_task(quartz_sched::schedule_task_every(
Duration::from_secs(6),
Box::new(quartz_sched::SimpleCallbackJob::new(
Box::new(|_| {
println!("[+] Scheduled job from another job");
}),
"".to_string(),
256,
)),
));
}
}
fn description(&self) -> String {
"my task".to_string()
}
fn key(&self) -> i64 {
43
}
}
impl quartz_sched::Job for Box<MyWeather> {
fn execute(&self, _: Option<quartz_sched::SchedulerHandle>) {
match reqwest::blocking::get("https://wttr.in/berlin?format=3") {
Ok(response) => match response.text() {
Ok(result) => {
println!("{}", &result);
}
Err(_) => {}
},
Err(_) => {}
}
}
fn description(&self) -> String {
"my wetter".to_string()
}
fn key(&self) -> i64 {
128
}
}
impl quartz_sched::Trigger for CustomTrigger {
fn next_fire_time(&self) -> Result<i64, quartz_sched::TriggerError> {
if *self.ref_count.borrow() == 10 {
return Err(quartz_sched::TriggerError);
}
let result = quartz_sched::nownano() + self.interval.as_nanos() as i64;
*self.ref_count.borrow_mut() += 1;
return Ok(result);
}
fn description(&self) -> String {
format!("CustomTrigger{{ref_count: {}}}", &self.ref_count.borrow())
}
}
fn main() {
let mut sched: quartz_sched::Scheduler = quartz_sched::Scheduler::new();
sched.start();
sched.schedule_task(quartz_sched::schedule_task_every(
Duration::from_secs(1),
Box::new(MyTask(Arc::new(AtomicUsize::new(0)))),
));
sched.schedule_task(quartz_sched::schedule_task_every(
Duration::from_secs(4),
Box::new(quartz_sched::SimpleCallbackJob::new(
Box::new(|_| {
println!("[+] From closure");
}),
"".to_string(),
8,
)),
));
sched.schedule_task(quartz_sched::schedule_task_with(
Box::new(MyWeather),
CustomTrigger {
interval: Duration::from_millis(2000),
ref_count: std::cell::RefCell::new(0),
},
));
match sched.get_scheduled_job( 8) {
Some(job) => {
println!("[+] Next run at tick: {}", &job.next_runtime);
}
None => {}
};
thread::sleep(Duration::from_secs(20));
_ = sched.delete_task(43);
}
Status
This library is ported from go-quartz by reugn.
Not every feature is implemented yet. Under development. Please use with caution.