对于经常性工作(又名 CRON 工作),我个人使用lightspeed_scheduler:
let job = Job::new("kernel", "dispatch_delete_old_data", Some(3), move || { let kernel_service_inner = kernel_service.clone(); Box::pin(async move { kernel_service_inner.dispatch_delete_old_data().await?; Ok(()) }) }); scheduler .add_job_with_scheduler( "* 0 4 * * *" .to_scheduler() .expect("scheduler.run: parsing kernel.delete_old_data cron expression"), job, ) .await;
info!("scheduler.run: Starting scheduler."); scheduler.run().await?.await?;
|
tokio-cron-scheduler是一个很好的(也许更简单)的替代方案。
let mut scheduler = JobScheduler::new();
scheduler.add(Job::new("1/10 * * * * *", |uuid, l| { println!("I run every 10 seconds"); }).expect("defining 10 seeconds job"));
scheduler.add(Job::new_async("1/7 * * * * *", |uuid, l| Box::pin( async { println!("I run async every 7 seconds"); })).expect("defining 7 seeconds job"));
scheduler.start().await;
|
一次性后台作业
对于一次性的后台工作,例如发送事务性电子邮件,我们需要一个队列。
我已经在如何使用 Rust 和 PostgreSQL 构建作业队列中讨论了这个主题,我仍然强烈推荐这个解决方案,因为它的操作简单性和性能都很好!
// queue job let job = Message::SendSignInEmail { email: "your@email.com".to_string(), name: "Sylvain Kerkour".to_string(), code: "000-000".to_string(), }; let _ = queue.push(job, Some(Utc::now())).await?;
|