diff --git a/src/background.rs b/src/background.rs index 61c94cd..872f533 100644 --- a/src/background.rs +++ b/src/background.rs @@ -2,10 +2,10 @@ use std::sync::Arc; use tokio::{sync::RwLock, time::Duration}; -use crate::{Tracker, TRACKER_NODES}; +use crate::{project::Project, Tracker, TRACKER_NODES}; impl Tracker { - pub fn start_select_tracker_background(api_base: Arc>) { + pub fn select_tracker_background(api_base: Arc>) { tokio::spawn(async move { loop { tokio::time::sleep(Duration::from_secs(60)).await; diff --git a/src/lib.rs b/src/lib.rs index 0c87c1e..4dd829d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,10 +4,10 @@ use tokio::sync::RwLock; use tokio::time::Duration; pub mod archivist; +pub mod background; pub mod item; pub mod project; pub mod task; -pub mod background; const TRACKER_NODES: [&str; 7] = [ // "http://localhost:8080", // 测试环境 @@ -28,7 +28,7 @@ pub struct Tracker { http_client: reqwest::Client, client_version: String, archivist: String, - project: Option, + project: Arc>>, } impl Tracker { @@ -38,9 +38,9 @@ impl Tracker { archivist: String, ) -> Result> { let api_base = Arc::new(RwLock::new(TRACKER_NODES[1])); - Self::start_select_tracker_background(Arc::clone(&api_base)); - Ok(Tracker { - api_base, + let project = Arc::new(RwLock::new(None)); + let t = Tracker { + api_base: Arc::clone(&api_base), api_version: "v1", project_id: project_id, http_client: reqwest::Client::builder() @@ -48,8 +48,11 @@ impl Tracker { .build()?, client_version, archivist, - project: None, - }) + project, + }; + Self::select_tracker_background(api_base); + t.update_project_background(); + Ok(t) } } diff --git a/src/project.rs b/src/project.rs index a290d45..61aa1a6 100644 --- a/src/project.rs +++ b/src/project.rs @@ -42,7 +42,7 @@ pub struct Project { } impl Tracker { - pub async fn fetch_project(&self) -> Result> { + async fn fetch_project(&self) -> Result> { println!("fetch_project... {}", self.project_id); let api_base = *self.api_base.read().await; @@ -51,15 +51,22 @@ impl Tracker { api_base, self.api_version, self.project_id ); let res = self.http_client.post(&url).send().await?; - // parse response as json let project: Project = serde_json::from_str(&res.text().await?)?; Ok(project) } - pub async fn get_project(&mut self) -> &Project { - if self.project.is_none() { - self.project = Some(self.fetch_project().await.unwrap()); - } - self.project.as_ref().unwrap() - } // if let 会转移所有权 + pub async fn update_project(&self) { + let project = self.project.clone(); + let new_project = self.fetch_project().await.unwrap(); + let mut write_guard = project.write().await; + *write_guard = Some(new_project); + } + + // pub async fn get_project(&mut self) -> &Project { + // if self.project.read().await.is_none() { + // let project = self.fetch_project().await.unwrap(); + // *self.project.write().await = Some(project); + // } + // self.project.read().await.as_ref().unwrap() + //} if let 会转移所有权 }