3个版本
新 0.1.3 | 2024年8月22日 |
---|---|
0.1.2 | 2024年8月5日 |
0.1.1 | 2024年7月23日 |
0.1.0 |
|
2 in #job-scheduling
402 每月下载量
135KB
3.5K SLoC
CronFrame 0.1.3
CronFrame既是框架也是CLI工具。
该框架允许在Rust项目中定义和调度带有宏的cron任务,这些宏可以用于“全局作用域”中的函数和结构体类型中。
没有宏的任务创建也是可能的,请参考仓库中的 no_macros.rs
示例。
同名的CLI工具用于启动框架的全局实例,以接受可以通过CLI命令添加的任务。
入门指南
要在Rust项目中使用此框架
$ cargo add cronframe
需要linkme crate以使宏工作,较新版本的linkme也可能工作。
$ cargo add [email protected]
安装CLI工具
$ cargo install cronframe
基本信息
使用的cron表达式解析器是cron。
调度时间是UTC。
可以定义三种类型的任务
- 全局任务
- 函数任务
- 方法任务
这些任务都通过宏定义,全局任务使用独立的宏,而函数和方法的任务需要一些设置。
可以托管任务的struct在cronframe的上下文中称为cron对象
,并通过cron_obj
宏定义。
cron对象的任务必须在用宏cron_impl
注解的独立实现块中定义。
注意:cron对象派生了Clone trait,因此其字段也必须如此。
框架支持每天的超时时间(超时状态每24小时重置)以毫秒为单位,如果值为0则禁用。
框架首次运行时,将在当前目录中创建一个名为templates的文件夹,其中包含7个文件
- base.html.tera
- index.htm.tera
- job.html.tera
- tingle.js
- cronframe.js
- styles.css
- tingle.css
默认情况下,服务器在localhost:8098上运行,端口可以在cronframe.toml
文件中更改。
通过cronframe.toml
提供更多配置选项。
默认日志文件大小为1MB。
如果您使用CLI工具,模板目录、日志目录以及与cronframe相关的任何其他文件都将位于用户目录下的.cronframe目录中。
教程
有关教程,请参考网站。
定义全局作业
#[macro_use]
extern crate cronframe;
use cronframe::CronFrame;
#[cron(expr="* * * * * * *", timeout="0")]
fn hello_job(){
println!("hello world!");
}
fn main(){
// init and gather global cron jobs
let cronframe = CronFrame::default();
// start the scheduler
cronframe.start_scheduler();
// to keep the main thread alive
// cronframe.keep_alive();
// alternatively, start the scheduler and keep main alive
// cronframe.run();
}
定义函数作业
#[macro_use]
extern crate cronframe;
use cronframe::CronFrame;
#[cron_obj]
struct User {
name: String,
}
#[cron_impl]
impl User {
#[fn_job(expr="* * * * * * *", timeout="0")]
fn hello_function_job(){
println!("hello world!");
}
}
fn main(){
let cronframe = CronFrame::default();
// this function collects all function jobs defined on a cron object
User::cf_gather_fn(cronframe.clone());
cronframe.start_scheduler();
// alternatively, start the scheduler and keep main alive
// cronframe.run();
}
定义方法作业
#[macro_use]
extern crate cronframe;
use cronframe::{CronFrame, CronFrameExpr};
#[cron_obj]
struct User {
name: String,
expr1: CronFrameExpr,
}
#[cron_impl]
impl User {
#[fn_job(expr="* * * * * * *", timeout="0")]
fn hello_function_job(){
println!("hello world!");
}
#[mt_job(expr="expr1")]
fn hello_method_job(self){
println!("hello world!");
}
}
fn main(){
let cronframe = CronFrame::default();
let mut user1 = User::new_cron_obj(
"John Smith".to_string(),
CronFrameExpr::new("0/5", "*", "*", "*", "*", "*", "*", 0)
);
// this method collects all jobs defined on a cron object
user1.cf_gather(cronframe.clone());
// in alternative if we only wanted to collect method jobs
// user1.cf_gather_mt(cronframe.clone());
cronframe.start_scheduler();
// alternatively, start the scheduler and keep main alive
// cronframe.run();
}
CLI 工具
首次启动时,该工具会在用户的家目录内生成一个 .cronframe 目录。
此目录包含模板文件夹、日志文件夹、cargo_targets 文件夹和 cli_jobs 文件夹。
要使用 cronframe.toml 文件配置 CLI 工具的 cronframe 实例,请将其放置在 .cronframe 目录中。
运行示例
如果示例在一个文件中,例如 base_example.rs
,请使用以下命令
$ cargo run --example base_example
如果示例在自己的 crate 中,例如 weather_alert
,请执行以下操作
$ cd examples/weather_alert
$ cargo run
运行测试
由于测试依赖于日志输出,因此必须按顺序运行测试,而不能并行运行。
$ cargo test -- --test-threads=1
依赖项
~27–62MB
~1M SLoC