Эх сурвалжийг харах

中控和退出信号控制加入

skyfffire 2 жил өмнө
parent
commit
8dd5b4fd50
2 өөрчлөгдсөн 51 нэмэгдсэн , 25 устгасан
  1. 13 0
      src/control_c.rs
  2. 38 25
      src/server.rs

+ 13 - 0
src/control_c.rs

@@ -0,0 +1,13 @@
+use std::sync::Arc;
+use std::sync::atomic::{AtomicBool, Ordering};
+
+pub fn exit_handler() -> Arc<AtomicBool> {
+    let running = Arc::new(AtomicBool::new(true));
+    let r = running.clone();
+    ctrlc::set_handler(move || {
+        r.store(false, Ordering::Relaxed);
+    })
+    .expect("Error setting Ctrl-C handler");
+
+    return running;
+}

+ 38 - 25
src/server.rs

@@ -1,50 +1,63 @@
 use std::sync::Arc;
+use std::sync::atomic::AtomicBool;
 use serde::Deserialize;
 use strategy::quant::Quant;
 use actix_web::{web, App, HttpResponse, HttpServer, Responder, post, get};
-use actix_web::dev::Server;
 use tokio::sync::Mutex;
 use tracing::{debug, info};
-#[derive(Deserialize)]
-#[derive(Debug)]
+
+
+#[derive(Deserialize, Debug)]
 struct InputData {
     stop: bool,
 }
 
+#[derive(Clone)]
+struct Arcs {
+    running: Arc<AtomicBool>,
+    quant_arc: Arc<Mutex<Quant>>
+}
+
 // 句柄 GET 请求
-#[get("/")]
-async fn get_handler(quant_arc: web::Data<Arc<Mutex<Quant>>>) -> impl Responder {
-    let quant = quant_arc.lock().await;
+#[get("/account")]
+async fn get_account(arcs: web::Data<Arcs>) -> impl Responder {
+    let quant = arcs.quant_arc.lock().await;
     HttpResponse::Ok().body(format!("Value: {}", quant.params.log_level))
 }
 
 // 句柄 POST 请求
-#[post("/")]
-async fn post_handler(quant_arc: web::Data<Arc<Mutex<Quant>>>, input: web::Json<InputData>) -> impl Responder {
-    let mut quant = quant_arc.lock().await;
+#[post("/exit")]
+async fn on_change(arcs: web::Data<Arcs>, input: web::Json<InputData>) -> impl Responder {
+    let mut quant = arcs.quant_arc.lock().await;
     debug!(?input);
 
     HttpResponse::Ok().body(format!("Incremented Value: {}", quant.params.log_level))
 }
 
-// Server要.await才能使用
-pub fn run_server(port: u32, quant_arc: Arc<Mutex<Quant>>) -> Server {
+pub fn run_server(port: u32, running: Arc<AtomicBool>, quant_arc: Arc<Mutex<Quant>>) {
     let addr = format!("127.0.0.1:{}", port);
     info!("中控绑定地址:{}", addr);
-    let bind_rst = HttpServer::new(move || {
+
+    let arcs = Arcs {
+        running,
+        quant_arc,
+    };
+
+    let server_fut = HttpServer::new(move || {
+        let arcs_clone = arcs.clone();
+
         App::new()
-            .app_data(web::Data::new(quant_arc.clone()))
-            .service(get_handler)
-            .service(post_handler)
+            .app_data(web::Data::new(arcs_clone))
+            .service(get_account)
+            .service(on_change)
     })
-    .bind(addr);
-
-    return match bind_rst {
-        Ok(server) => {
-            server.run()
-        },
-        Err(err) => {
-            panic!("{}", format!("Bind port error:{}", err.to_string()))
-        }
-    }
+    .bind(addr)
+    .expect("Bind port error")
+    .run();
+
+    info!("中控服务已运行。");
+
+    tokio::spawn(async move {
+        server_fut.await.expect("error running the server");
+    });
 }