10 releases

0.2.2 Oct 19, 2024
0.2.1 Oct 6, 2024
0.2.0 Sep 28, 2024
0.1.1 Sep 8, 2024
0.0.8 Aug 25, 2024

#8 in #spring-boot

Download history 118/week @ 2024-08-07 149/week @ 2024-08-14 279/week @ 2024-08-21 18/week @ 2024-08-28 376/week @ 2024-09-04 37/week @ 2024-09-11 16/week @ 2024-09-18 129/week @ 2024-09-25 157/week @ 2024-10-02 42/week @ 2024-10-09 155/week @ 2024-10-16 19/week @ 2024-10-23 6/week @ 2024-10-30

182 downloads per month

MIT license

73KB
1.5K SLoC

crates.io Documentation

Dependencies

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

API interface

App implements the JobConfigurator feature, which can be used to configure the scheduling task:

use spring::App;
use spring_job::{cron, JobPlugin, JobConfigurator, Jobs};
use spring_sqlx::SqlxPlugin;

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

fn jobs() -> Jobs {
    Jobs::new().typed_job(cron_job)
}

#[cron("1/10 * * * * *")]
async fn cron_job() {
    println!("cron scheduled: {:?}", SystemTime::now())
}

You can also use the auto_config macro to implement automatic configuration. This process macro will automatically register the scheduled tasks marked by the Procedural Macro into the app:

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

Extract the Component registered by the plugin

The SqlxPlugin plugin above automatically registers a Sqlx connection pool component for us. We can use Component to extract this connection pool from App. It should be noted that although the implementation principles of spring-job's Component and spring-web's Component are similar, these two extractors belong to different crates.

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)
}

Dependencies

~11–22MB
~299K SLoC