This commit is contained in:
OverflowCat 2024-07-09 20:57:59 +08:00
parent 53de2a0b1c
commit 5c47a6eefc
3 changed files with 27 additions and 17 deletions

View File

@ -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<RwLock<&'static str>>) {
pub fn select_tracker_background(api_base: Arc<RwLock<&'static str>>) {
tokio::spawn(async move {
loop {
tokio::time::sleep(Duration::from_secs(60)).await;

View File

@ -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>,
project: Arc<RwLock<Option<Project>>>,
}
impl Tracker {
@ -38,9 +38,9 @@ impl Tracker {
archivist: String,
) -> Result<Self, Box<dyn std::error::Error>> {
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)
}
}

View File

@ -42,7 +42,7 @@ pub struct Project {
}
impl Tracker {
pub async fn fetch_project(&self) -> Result<Project, Box<dyn std::error::Error>> {
async fn fetch_project(&self) -> Result<Project, Box<dyn std::error::Error>> {
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 会转移所有权
}