在异步 tokio 环境中使用类似 cron 的调度。 还可以立即调度任务或以固定时间间隔重复执行任务。 任务数据可以选择使用 PostgreSQL 或 Nats 进行持久化。
灵感来自 https://github.com/lholden/job_scheduler
更多详细信息请参阅文档。
请确保在 Cargo.toml 中添加 job_scheduler crate:
[dependencies] tokio-cron-scheduler = "*"
使用 cron 库的 Schedule 类型的 FromStr 实现来为作业创建调度。
调度格式如下:
秒 分 时 日 月 星期 年 * * * * * * *
时间以 UTC 指定,而非您的本地时区。请注意,年份可以省略。如果您想使用您的时区,请在作业创建调用后附加 _tz(例如 Job::new_async 对比 Job::new_async_tz)。
以逗号分隔的值(如 5,8,10)表示多个时间值。例如,调度 0 2,14,26 * * * * 将在每小时的第 2、14 和 26 分钟执行。
范围可以用破折号指定。调度 0 0 * 5-10 * * 将每小时执行一次,但仅在每月的 5 日至 10 日执行。
星期几可以用缩写或全名指定。调度 0 0 6 * * Sun,Sat 将在周日和周六的早上 6 点执行。
对于每个作业,您可以在作业开始、停止和移除时收到通知。由于这些通知是使用 tokio::spawn 调度的,如果任务快速完成,则无法保证这些通知的顺序。
一个简单的使用示例:
use std::time::Duration; use tokio_cron_scheduler::{Job, JobScheduler, JobSchedulerError}; #[tokio::main] async fn main() -> Result<(), JobSchedulerError> { let mut sched = JobScheduler::new().await?; // 添加基本 cron 作业 sched.add( Job::new("1/10 * * * * *", |_uuid, _l| { println!("我每 10 秒运行一次"); })? ).await?; // 添加异步作业 sched.add( Job::new_async("1/7 * * * * *", |uuid, mut l| { Box::pin(async move { println!("我每 7 秒异步运行一次"); // 查询此作业的下一次执行时间 let next_tick = l.next_tick_for_job(uuid).await; match next_tick { Ok(Some(ts)) => println!("7 秒作业的下一次运行时间是 {:?}", ts), _ => println!("无法获取 7 秒作业的下一次运行时间"), } }) })? ).await?; // 添加指定持续时间的一次性作业 sched.add( Job::new_one_shot(Duration::from_secs(18), |_uuid, _l| { println!("我只运行一次"); })? ).await?; // 创建指定持续时间的重复作业,使其可变以便之后编辑 let mut jj = Job::new_repeated(Duration::from_secs(8), |_uuid, _l| { println!("我每 8 秒重复运行一次"); })?; // 添加在作业开始/停止等时执行的操作 jj.on_start_notification_add(&sched, Box::new(|job_id, notification_id, type_of_notification| { Box::pin(async move { println!("作业 {:?} 已启动,通知 {:?} 已运行({:?})", job_id, notification_id, type_of_notification); }) })).await?; jj.on_stop_notification_add(&sched, Box::new(|job_id, notification_id, type_of_notification| { Box::pin(async move { println!("作业 {:?} 已完成,通知 {:?} 已运行({:?})", job_id, notification_id, type_of_notification); }) })).await?; jj.on_removed_notification_add(&sched, Box::new(|job_id, notification_id, type_of_notification| { Box::pin(async move { println!("作业 {:?} 已移除,通知 {:?} 已运行({:?})", job_id, notification_id, type_of_notification); }) })).await?; sched.add(jj).await?; // 必须启用 'signal' 功能 sched.shutdown_on_ctrl_c(); // 添加在关闭期间/之后运行的代码 sched.set_shutdown_handler(Box::new(|| { Box::pin(async move { println!("关闭完成"); }) })); // 启动调度器 sched.start().await?; // 等待作业运行 tokio::time::sleep(Duration::from_secs(100)).await; Ok(()) }
您可以使用 JobBuilder API 创建使用特定时区的作业。
chrono-tz 不包含在依赖项中,因此如果您想轻松创建 Timezone 结构,需要将其添加到您的 Cargo.toml 中。
let job = JobBuilder::new() .with_timezone(chrono_tz::Africa::Johannesburg) .with_cron_job_type() .with_schedule("*/2 * * * * *") .unwrap() .with_run_async(Box::new( | uuid, mut l| { Box::pin(async move { info ! ("JHB 每 2 秒异步运行一次,id {:?}", uuid); let next_tick = l.next_tick_for_job(uuid).await; match next_tick { Ok(Some(ts)) => info !("JHB 2 秒作业的下一次运行时间是 {:?}", ts), _ => warn !("无法获取 2 秒作业的下一次运行时间"), } }) })) .build() .unwrap();
TokioCronScheduler 使用以下任一许可证
MetadataStore和NotificationStore特质可以被实现并在JobScheduler中使用。
默认提供了基于易失性哈希映射的SimpleMetadataStore和SimpleNotificationStore版本。使用Nats的持久版本由NatsMetadataStore和NatsNotificationStore提供。
除非您另有明确声明,否则您有意提交以包含在作品中的任何贡献,按照Apache-2.0许可证的定义,均应按上述方式双重许可,无任何附加条款或条件。
更多信息请参阅CONTRIBUTING文件。
自0.7版本起
使Prost生成的数据结构可被需要获取数据结构字节的存储使用。Nats和Postgres存储依赖于启用此特性。
自0.6版本起
添加Postgres元数据存储和通知存储(PostgresMetadataStore, PostgresNotificationStore)。使用Postgres数据库存储元数据和通知数据。
自0.6版本起
使用postgres-native-tls crate作为PostgreSQL连接的TLS提供程序。
自0.6版本起
使用postgres-openssl crate作为PostgreSQL连接的TLS提供程序。
自0.6版本起
添加Nats元数据存储和通知存储(NatsMetadataStore, NatsNotificationStore)。使 用Nats系统作为存储元数据和通知的方式。
参见Nats文档
自0.5版本起
为调度器添加shutdown_on_signal和shutdown_on_ctrl_c。
当接收到信号时,两者都会关闭系统(停止调度器并移除所有任务)。
由于这利用了Tokio的信号处理,因此仅在Unix系统上可用。
在进行tokio::test时,记得在多线程上下文中运行,否则测试将在scheduler.add()上挂起。
例如:
#[cfg(test)] mod test { use tokio_cron_scheduler::{Job, JobScheduler}; use tracing::{info, Level}; use tracing_subscriber::FmtSubscriber; // 需要多线程来测试,否则会在scheduler.add()上挂起 #[tokio::test(flavor = "multi_thread", worker_threads = 2)] // #[tokio::test] async fn test_schedule() { let subscriber = FmtSubscriber::builder() .with_max_level(Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber) .expect("设置默认订阅者失败"); info!("创建调度器"); let scheduler = JobScheduler::new().await.unwrap(); info!("添加任务"); scheduler .add( Job::new_async("*/1 * * * * *", |_, _| { Box::pin(async { info!("每秒运行"); }) }) .unwrap(), ) .await .expect("应该能够添加任务"); scheduler.start().await.unwrap(); tokio::time::sleep(core::time::Duration::from_secs(20)).await; } }
运行基于内存哈希映射的存储
cargo run --example simple --features="tracing-subscriber"
首先需要一个运行中的PostgreSQL实例:
docker run --rm -it -p 5432:5432 -e POSTGRES_USER="postgres" -e POSTGRES_PASSWORD="" -e POSTGRES_HOST_AUTH_METHOD="trust" postgres:14.1
然后运行示例:
POSTGRES_INIT_METADATA=true POSTGRES_INIT_NOTIFICATIONS=true cargo run --example postgres --features="postgres_storage tracing-subscriber"
首先需要一个启用了Jetstream的运行中的Nats实例:
docker run --rm -it -p 4222:4222 -p 6222:6222 -p 7222:7222 -p 8222:8222 nats -js -DV
然后运行示例:
cargo run --example nats --features="nats_storage tracing-subscriber"


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数 据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环 境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号