#作业调度器 #作业 #cron #作业调度 #作业 #quartz #require

woddle

一个异步、同步、基于数据库的 Rust 作业调度器

9 个不稳定版本

0.5.0 2023 年 11 月 17 日
0.4.0 2023 年 1 月 25 日
0.3.1 2021 年 7 月 17 日
0.3.0 2021 年 1 月 25 日
0.1.3 2020 年 10 月 10 日

#80日期和时间

Download history 3/week @ 2024-03-08 2/week @ 2024-03-15 33/week @ 2024-03-29 1/week @ 2024-04-19 19/week @ 2024-04-26

每月 200 次下载

Apache-2.0

31KB
476

CI crates.io docs

woddle

一个异步、同步、基于数据库的 Rust 作业调度器

注意:woddle 需要 Rust 1.60 或更高版本。

使用方法

[dependencies]
woddle = "0.5"

# For connection pooling
# woddle = { version = "0.5", features = ["pool-mobc"] }

功能

  • 通过间隔调度
  • 通过 cron (quartz) 调度
  • 通过 PostgreSQL 在多个实例之间同步
  • 完全异步(目前仅支持 Tokio
  • 可选使用 mobc 进行数据库连接池管理

配置

use woddle::{async_trait, JobConfig, RunnerConfig, Job, JobRunner};
use std::time::Duration;

#[derive(Clone)]
struct MyJob {
    config: JobConfig,
}

#[async_trait]
impl Job for MyJob {
    async fn run(&self) {
        println!("starting  my job!");
    }

    fn get_config(&self) -> &JobConfig {
        &self.config
    }
}

#[tokio::main]
async fn main() {
    let job_cfg = JobConfig::new("my_job", "someSyncKey").interval(Duration::from_secs(120));
    let my_job = MyJob { config: job_cfg };

    let config = RunnerConfig::default().check_interval(Duration::from_secs(60));
    let job_runner = JobRunner::new(config).add_job(my_job);

    tokio::spawn(async move {
        if let Err(e) = job_runner.start().await {
            eprintln!("error: {}", e);
        }
    });
    ...
}

使用连接池进行配置

use mobc::Pool;
use mobc_postgres::{tokio_postgres, PgConnectionManager};
use tokio_postgres::{Config, NoTls};
use woddle::{async_trait, JobConfig, RunnerConfig, Job, JobRunner};
use std::time::Duration;

#[tokio::main]
async fn main() {
    let config = Config::from_str("host=localhost user=postgres port=5432")
        .expect("default config is valid");
    let manager = PgConnectionManager::new(config, NoTls);
    let pool = Pool::builder().build(manager);

    let job_cfg = JobConfig::new("my_job", "someSyncKey").cron("0/15 * * * * * *");
    let my_job = MyJob { config: job_cfg };

    let config = RunnerConfig::default()
        .check_interval(Duration::from_secs(1))
        .pool(pool.clone());
    let job_runner = JobRunner::new(config).add_job(my_job);

    tokio::spawn(async move {
        if let Err(e) = job_runner.start().await {
            eprintln!("error: {}", e);
        }
    });
    ...
}

更多示例

可以在 示例 文件夹中找到。

运行方式

 RUST_LOG=info cargo run --example basic

在间隔和 cron 中

您可以使用此库配置多个间隔、延迟和 cron 调度。

RunnerConfig

  • initial_delay - 延迟作业运行器的启动,当它最初启动时(默认为 None)
  • check_interval - 定义作业运行器检查是否有作业应该运行的时间间隔(默认为 60s)

JobConfig

  • interval - 作业应该运行的时间间隔
  • cron - 作业应该运行的 cron 调度(使用 quartz cron 表达式)

每个作业都需要设置 intervalcron,否则作业运行器将错误退出。在选择这些值时,请记住,要给作业足够的时间运行,并相应地设置 check_interval

例如,使用cron表达式的最小运行时间是每1秒一次。如果您选择一个非常低的check_interval,例如每10毫秒一次,您可能会遇到问题。在这种情况下,由于四舍五入的问题,工作可能会在相同的一秒内运行几次。

因此,任何低秒级的运行间隔,具有亚秒级的检查间隔,可能会导致不一致,并且超出了这个库的范围。

依赖关系

~9–20MB
~283K SLoC