定时任务所有的触发业务均放置到library中,server中只包含任务的业务逻辑

This commit is contained in:
李运家 2024-09-26 17:38:55 +08:00
parent 480139ed1e
commit f62b892c80
5 changed files with 22 additions and 19 deletions

View File

@ -2,8 +2,8 @@ use tokio_cron_scheduler::{Job, JobScheduler, JobSchedulerError};
pub struct Task { pub struct Task {
pub name: String, pub name: String,
pub job: Box<dyn Fn(String, String) -> Result<Job, JobSchedulerError> + Send + Sync>, pub job: Box<dyn Fn() + Send + Sync + 'static>,
pub interval: String pub trigger: String
} }
/// 启动定时任务 /// 启动定时任务
@ -20,7 +20,12 @@ async fn schedule(tasks: Vec<Task>) -> Result<(), JobSchedulerError> {
// 添加任务 // 添加任务
for task in tasks { for task in tasks {
let _task_uuid = scheduler.add((&task.job)(task.name, task.interval).unwrap()).await?; let task: &'static Task = Box::leak(Box::new(task));
let _task_uuid = scheduler.add(Job::new_async(task.trigger.as_str(), move |_uuid, _l| {
Box::pin(async move {
(&task.job)();
})
})?).await?;
} }
// 添加关闭监听 // 添加关闭监听

View File

@ -10,16 +10,16 @@ mod tasks;
/// 启动服务 /// 启动服务
pub async fn serve() { pub async fn serve() {
let addr = format!("0.0.0.0:{}", config!().server.port); let addr = format!("0.0.0.0:{}", config!().server.port);
let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
tracing::info!("服务监听地址: {}", addr); tracing::info!("服务监听地址: {}", addr);
// 启动任务
task::start(get_tasks()).await; task::start(get_tasks()).await;
// 启动应用服务
axum::serve(listener, init()).await.unwrap(); axum::serve(listener, init()).await.unwrap();
} }
// 初始化router包括router中间件和数据 /// 初始化router包括router中间件和数据
fn init() -> Router { fn init() -> Router {
let trace_layer = TraceLayer::new_for_http().make_span_with(|request: &Request<Body>| { let trace_layer = TraceLayer::new_for_http().make_span_with(|request: &Request<Body>| {
let req_id = match request let req_id = match request

View File

@ -1,10 +0,0 @@
use tokio_cron_scheduler::{Job, JobSchedulerError};
pub fn get_task(name: String, cron: String) -> Result<Job, JobSchedulerError> {
tracing::info!("添加定时任务: {}", name);
Job::new_async(cron.as_str(), move |_uuid, _l| {
Box::pin(async move {
tracing::info!("定时任务执行中");
})
})
}

View File

@ -0,0 +1,7 @@
use std::fmt::Result;
use tokio_cron_scheduler::{Job, JobSchedulerError};
pub fn xxx_task() {
tracing::info!("定时任务执行中");
}

View File

@ -1,11 +1,12 @@
use library::task::Task; use library::task::Task;
pub mod google_iap; pub mod google_tasks;
/// 定时任务维护器
pub fn get_tasks() -> Vec<Task> { pub fn get_tasks() -> Vec<Task> {
vec!(Task { vec!(Task {
name: "google_iap".to_string(), name: "google_iap".to_string(),
job: Box::new(google_iap::get_task), job: Box::new(google_tasks::xxx_task),
interval: "0 0 0/1 * * ?".to_string(), trigger: "0 0/1 * * * ?".to_string(),
}) })
} }