use anyhow::Result;
use delay_timer::prelude::*;
#[allow(deprecated)]
use delay_timer::utils::convenience::functions::unblock_process_task_fn;
use hyper::{Client, Uri};
use std::time::Duration;
use tokio::time::sleep;
use tracing::Level;
use tracing_subscriber::FmtSubscriber;
#[tokio::main]
async fn main() -> Result<()> {
FmtSubscriber::builder()
.with_max_level(Level::DEBUG)
.init();
let delay_timer = DelayTimerBuilder::default().build();
let task_instance_chain = delay_timer.insert_task(build_task_async_print()?)?;
let shell_task_instance_chain = delay_timer.insert_task(build_task_async_execute_process()?)?;
let task_instance = task_instance_chain.next_with_async_wait().await?;
sleep(Duration::from_secs(1)).await;
task_instance.cancel_with_async_wait().await?;
let _ = shell_task_instance_chain
.next_with_async_wait()
.await?
.cancel_with_async_wait()
.await?;
delay_timer.remove_task(1)?;
Ok(delay_timer.stop_delay_timer()?)
}
fn build_task_async_print() -> Result<Task, TaskError> {
let id = 1;
let name = String::from("someting");
let mut task_builder = TaskBuilder::default();
let body = move || {
let name_ref = name.clone();
async move {
async_template(id, name_ref).await.expect("Request failed.");
sleep(Duration::from_secs(3)).await;
println!("create_async_fn_body:i'success");
}
};
task_builder
.set_task_id(1)
.set_frequency_repeated_by_seconds(6)
.set_maximum_parallel_runnable_num(2)
.spawn_async_routine(body)
}
fn build_task_async_execute_process() -> Result<Task, TaskError> {
let task_id = 3;
let mut task_builder = TaskBuilder::default();
let body = move || {
#[allow(deprecated)]
unblock_process_task_fn("/opt/homebrew/bin/php /Users/bincheng_paopao/project/repo/rust/myself/delay-timer/examples/try_spawn.php >> ./try_spawn.txt".into(), task_id)
};
task_builder
.set_frequency_repeated_by_seconds(1)
.set_task_id(task_id)
.set_maximum_running_time(10)
.set_maximum_parallel_runnable_num(1)
.spawn_async_routine(body)
}
pub async fn async_template(id: i32, name: String) -> Result<()> {
let client = Client::new();
let url = format!("http://httpbin.org/get?id={id}&name={name}");
let uri: Uri = url.parse()?;
let res = client.get(uri).await?;
println!("Response: {}", res.status());
let buf = hyper::body::to_bytes(res).await?;
println!("body: {buf:?}");
Ok(())
}