Skip to content

Commit 54d1f0e

Browse files
Merge pull request #86 from silent-rs/features/set_scheduler_global
feat(scheduler): 添加调度器中间件并优化调度器初始化
2 parents 6929bc6 + 616546f commit 54d1f0e

File tree

6 files changed

+31
-14
lines changed

6 files changed

+31
-14
lines changed

silent/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,4 @@ pub use handler::HandlerWrapper;
4646
pub use headers;
4747
pub use hyper::{Method, StatusCode, header};
4848
#[cfg(feature = "scheduler")]
49-
pub use scheduler::{ProcessTime, Scheduler, SchedulerExt, Task};
49+
pub use scheduler::{ProcessTime, SCHEDULER, Scheduler, SchedulerExt, Task};

silent/src/prelude.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub use crate::middleware::MiddleWareHandler;
1919
pub use crate::route::handler_append::{HandlerAppend, HandlerGetter};
2020
pub use crate::route::{RootRoute, Route, RouteService, RouterAdapt};
2121
#[cfg(feature = "scheduler")]
22-
pub use crate::scheduler::{SchedulerExt, Task};
22+
pub use crate::scheduler::{SCHEDULER, SchedulerExt, Task};
2323
#[cfg(feature = "security")]
2424
pub use crate::security::{argon2, pbkdf2};
2525
#[cfg(feature = "server")]

silent/src/route/root.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#[cfg(feature = "scheduler")]
2-
use crate::Scheduler;
31
#[cfg(feature = "cookie")]
42
use crate::cookie::middleware::CookieMiddleware;
53
use crate::middlewares::RequestTimeLogger;
@@ -17,8 +15,6 @@ use async_session::SessionStore;
1715
use async_trait::async_trait;
1816
use std::fmt;
1917
use std::sync::Arc;
20-
#[cfg(feature = "scheduler")]
21-
use tokio::sync::Mutex;
2218

2319
#[derive(Clone, Default)]
2420
pub struct RootRoute {
@@ -27,8 +23,6 @@ pub struct RootRoute {
2723
#[cfg(feature = "session")]
2824
pub(crate) session_set: bool,
2925
pub(crate) configs: Option<Configs>,
30-
#[cfg(feature = "scheduler")]
31-
pub(crate) scheduler: Arc<Mutex<Scheduler>>,
3226
}
3327

3428
impl fmt::Debug for RootRoute {
@@ -51,8 +45,6 @@ impl RootRoute {
5145
#[cfg(feature = "session")]
5246
session_set: false,
5347
configs: None,
54-
#[cfg(feature = "scheduler")]
55-
scheduler: Arc::new(Mutex::new(Scheduler::new())),
5648
}
5749
}
5850

@@ -110,8 +102,6 @@ impl Handler for RootRoute {
110102
tracing::debug!("{:?}", req);
111103
let configs = self.configs.clone().unwrap_or_default();
112104
req.configs = configs.clone();
113-
#[cfg(feature = "scheduler")]
114-
req.extensions_mut().insert(self.scheduler.clone());
115105

116106
let mut root_middlewares = vec![];
117107
for middleware in self.middlewares.iter().cloned() {

silent/src/scheduler/middleware.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use crate::{Handler, MiddleWareHandler, Next, Request, Response, Result};
2+
use async_trait::async_trait;
3+
4+
#[derive(Debug, Default)]
5+
pub struct SchedulerMiddleware {}
6+
7+
impl SchedulerMiddleware {
8+
pub(crate) fn new() -> Self {
9+
Self::default()
10+
}
11+
}
12+
13+
#[async_trait]
14+
impl MiddleWareHandler for SchedulerMiddleware {
15+
async fn handle(&self, mut req: Request, next: &Next) -> Result<Response> {
16+
let scheduler = super::SCHEDULER.clone();
17+
req.extensions_mut().insert(scheduler);
18+
next.call(req).await
19+
}
20+
}

silent/src/scheduler/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
pub(crate) mod middleware;
12
mod process_time;
23
mod storage;
34
mod task;
45
pub mod traits;
56

67
use anyhow::{Result, anyhow};
7-
use std::sync::Arc;
8+
use std::sync::{Arc, LazyLock};
89
use std::thread;
910
use tokio::sync::Mutex;
1011
use tracing::{debug, error, info};
@@ -13,6 +14,9 @@ pub use process_time::ProcessTime;
1314
pub use task::Task;
1415
pub use traits::SchedulerExt;
1516

17+
pub static SCHEDULER: LazyLock<Arc<Mutex<Scheduler>>> =
18+
LazyLock::new(|| Arc::new(Mutex::new(Scheduler::new())));
19+
1620
#[derive(Debug, Clone)]
1721
pub struct Scheduler {
1822
tasks: Vec<Task>,

silent/src/service/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use crate::Configs;
66
use crate::Scheduler;
77
use crate::core::listener::Listener;
88
use crate::route::RouteService;
9+
#[cfg(feature = "scheduler")]
10+
use crate::scheduler::{SCHEDULER, middleware::SchedulerMiddleware};
911
use crate::service::serve::Serve;
1012
use std::net::SocketAddr;
1113
use tokio::net::{TcpListener, UnixListener};
@@ -117,9 +119,10 @@ impl Server {
117119
#[cfg(feature = "cookie")]
118120
root_route.check_cookie();
119121
#[cfg(feature = "scheduler")]
120-
let scheduler = root_route.scheduler.clone();
122+
root_route.hook_first(SchedulerMiddleware::new());
121123
#[cfg(feature = "scheduler")]
122124
tokio::spawn(async move {
125+
let scheduler = SCHEDULER.clone();
123126
Scheduler::schedule(scheduler).await;
124127
});
125128
let mut join_set = JoinSet::new();

0 commit comments

Comments
 (0)