spring-job插件

spring-job是基于tokio-cron-scheduler实现的

crates.io Documentation

依赖

spring-job = { version = "<version>" }

API接口

App实现了JobConfigurator特征,可以通过该特征配置调度任务:

1#[tokio::main]
2async fn main() {
3 App::new()
4 .add_plugin(JobPlugin)
5 .add_plugin(SqlxPlugin)
6 .add_jobs(jobs())
7 .run()
8 .await
9}
10
11fn jobs() -> Jobs {
12 Jobs::new().typed_job(cron_job)
13}
14
15#[cron("1/10 * * * * *")]
16async fn cron_job() {
17 println!("cron scheduled: {:?}", SystemTime::now())
18}

你也可以使用auto_config宏来实现自动配置,这个过程宏会自动将被过程宏标记的调度任务注册进app中:

+#[auto_config(JobConfigurator)]
 #[tokio::main]
 async fn main() {
     App::new()
         .add_plugin(JobPlugin)
         .add_plugin(SqlxPlugin)
-        .add_jobs(jobs())
         .run()
         .await
}

提取插件注册的Component

上面的SqlxPlugin插件为我们自动注册了一个Sqlx连接池组件,我们可以使用Component从App中提取这个连接池。需要注意spring-jobComponentspring-webComponent虽然实现原理类似,但这两个extractor归属不同的crate下。

use spring_sqlx::{
    sqlx::{self, Row}, ConnectPool
};
use spring_job::cron;
use spring_job::extractor::Component;

#[cron("1/10 * * * * *")]
async fn cron_job(Component(db): Component<ConnectPool>) {
    let time: String = sqlx::query("select DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s') as time")
        .fetch_one(&db)
        .await
        .context("query failed")
        .unwrap()
        .get("time");
    println!("cron scheduled: {:?}", time)
}

读取配置

你可以用Config抽取toml中的配置。用法上和spring-web完全一致。

#[derive(Debug, Configurable, Deserialize)]
#[config_prefix = "custom"]
struct CustomConfig {
    a: u32,
    b: bool,
}

#[cron("1/10 * * * * *")]
async fn use_toml_config(Config(conf): Config<CustomConfig>) -> impl IntoResponse {
    format!("a={}, b={}", conf.a, conf.b)
}

在你的配置文件中添加相应配置:

[custom]
a = 1
b = true