spring-job插件
spring-job是基于tokio-cron-scheduler实现的
依赖
spring-job = { version = "<version>" }
API接口
App实现了JobConfigurator特征,可以通过该特征配置调度任务:
1 #[tokio::main]
2 async fn main() {
3 App::new()
4 .add_plugin(JobPlugin)
5 .add_plugin(SqlxPlugin)
6 .add_jobs(jobs())
7 .run()
8 .await
9 }
10
11 fn jobs() -> Jobs {
12 Jobs::new().typed_job(cron_job)
13 }
14
15 #[cron("1/10 * * * * *")]
16 async 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-job
的Component
和spring-web
的Component
虽然实现原理类似,但这两个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