Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mitghi/quartz.rs

Minimalist scheduling library for Rust
https://github.com/mitghi/quartz.rs

background-jobs crossbeam job-scheduler scheduler

Last synced: 13 days ago
JSON representation

Minimalist scheduling library for Rust

Awesome Lists containing this project

README

        

# quartz.rs

Minimalist scheduling library for Rust

### Example

```rust
use std::{thread, time::Duration};
use std::sync::{Arc, atomic::{AtomicUsize, Ordering}};
use reqwest;

// MyTask is simple task run by scheduler.
struct MyTask(Arc);

// MyWeather is simple task which requests
// whether report.
struct MyWeather;

// CustomTrigger is a simple custom trigger
// which quits the execution loop after
// `ref_count` reaches a certain threshold.
struct CustomTrigger {
interval: Duration,
ref_count: std::cell::RefCell,
}

// Implement Job trait for `MyTask` to make
// `MyTask` schedulable.
impl quartz_sched::Job for Box {
fn execute(&self, engine: Option) {
println!("[+] Executing 'MyTask'");

if self.0.clone().fetch_add(1, Ordering::SeqCst) > 10 {
println!("[+] Reached count 10");
// restart the counter
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
}
}

// Implement Job trait for `MyWeather` to make
// `MyWeather` schedulable.
impl quartz_sched::Job for Box {
fn execute(&self, _: Option) {
// request whether report for Berlin
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
}
}

// Implement `Trigger` for `CustomTrigger`
// to schedule the task based on value
// returned from `next_fire_time`.
impl quartz_sched::Trigger for CustomTrigger {
fn next_fire_time(&self) -> Result {
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();

// start the scheduler
// spawns execution and feeder threads
sched.start();

// execute every interval N
sched.schedule_task(quartz_sched::schedule_task_every(
Duration::from_secs(1),
Box::new(MyTask(Arc::new(AtomicUsize::new(0)))),
));

// execute after duration N
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,
)),
));

// execute with custom trigger
sched.schedule_task(quartz_sched::schedule_task_with(
Box::new(MyWeather),
CustomTrigger {
interval: Duration::from_millis(2000),
// trigger expires after `ref_count` reaches
// a certain threshold, therefore will be
// removed by the scheduler from the execution
// loop.
ref_count: std::cell::RefCell::new(0),
},
));

// get scheduled job meta info from scheduler
match sched.get_scheduled_job(/*key*/ 8) {
Some(job) => {
println!("[+] Next run at tick: {}", &job.next_runtime);
}
None => {}
};

thread::sleep(Duration::from_secs(20));

// scheduler will stop after getting dropped
// alternatively, call sched.stop() to stop
// the scheduler.

// delete task associated with key from scheduler
_ = sched.delete_task(43);
}
```

#### Status

This library is ported from [go-quartz](https://github.com/reugn/go-quartz) by [reugn](https://github.com/reugn).
Not every feature is implemented yet. Under development. Please use with caution.