#cron #cli-tool #job-scheduling #cronjobmacro #cronjobtool

bin+lib cronframe

一个带有Web服务器和CLI工具的宏注解定时任务框架

3个版本

0.1.3 2024年8月22日
0.1.2 2024年8月5日
0.1.1 2024年7月23日
0.1.0 2024年7月22日

2 in #job-scheduling

Download history 198/week @ 2024-07-18 75/week @ 2024-07-25 113/week @ 2024-08-01 16/week @ 2024-08-08

402 每月下载量

MIT/Apache

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