use lazy_static::lazy_static;
use cron::Schedule;
use std::str::FromStr;
lazy_static! {
pub static ref ONE_SEC: &'static str = "0/1 * * * * * *";
pub static ref TWO_SEC: &'static str = "0/2 * * * * * *";
}
pub async fn running<F>(expr: &str, period_millis: u64, f: F)
where
F: Fn() + Send + 'static,
{
let schedule = match Schedule::from_str(expr) {
Ok(schedule) => {
log::info!("start-a-looop: expr={}, func_name={}", expr, getname(&f));
schedule
}
Err(err) => {
log::error!(
"Invalid time expression: func_name={}, error={:?}",
getname(&f),
err
);
return;
}
};
let mut interval = tokio::time::interval(std::time::Duration::from_millis(period_millis));
loop {
let mut upcoming = schedule.upcoming(chrono::Utc).take(1);
tokio::select! {
_ = interval.tick() => {
if let Some(datetime) = upcoming.next() {
if datetime.timestamp() <= chrono::Utc::now().timestamp() {
f();
}
}
}
_ = tokio::signal::ctrl_c() => {
log::info!("tokio::signal::ctrl_c() - 1");
break;
}
}
}
}
pub async fn interval<F>(period_millis: u64, f: F)
where
F: Fn() + Send + 'static,
{
let mut interval = tokio::time::interval(std::time::Duration::from_millis(period_millis));
log::info!(
"start-a-interval: period_millis={}, func_name={}",
period_millis,
getname(&f)
);
loop {
tokio::select! {
_ = interval.tick() => {
f();
}
_ = tokio::signal::ctrl_c() => {
log::info!("tokio::signal::ctrl_c() - 2");
break;
}
}
}
}
fn getname<F>(_: &F) -> &'static str
where
F: Fn() + Send + 'static,
{
std::any::type_name::<F>()
}