server.rs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. use std::sync::Arc;
  2. use std::sync::atomic::{AtomicBool, Ordering};
  3. use std::time::Duration;
  4. use actix_web::{web, App, HttpResponse, HttpServer, Responder, post, get};
  5. use tokio::sync::Mutex;
  6. use tracing::{info};
  7. use global::cci::CentralControlInfo;
  8. #[derive(Clone)]
  9. struct Arcs {
  10. running: Arc<AtomicBool>,
  11. cci_cache_arc: Arc<Mutex<CentralControlInfo>>
  12. }
  13. // 句柄 GET 请求
  14. #[get("/account")]
  15. async fn get_account(arcs: web::Data<Arcs>) -> impl Responder {
  16. // --------------------------------数据解锁处理--------------------------------
  17. let cci = arcs.cci_cache_arc.lock().await;
  18. // --------------------------------回报--------------------------------
  19. let json_string = serde_json::to_string(&(cci.clone())).unwrap();
  20. HttpResponse::Ok().content_type("application/json").body(json_string)
  21. }
  22. // 句柄 POST 请求
  23. #[post("/exit")]
  24. async fn on_change(arcs: web::Data<Arcs>) -> impl Responder {
  25. arcs.running.store(false, Ordering::Relaxed);
  26. HttpResponse::Ok().body("程序已收到退出信号,将在清退仓位后退出。".to_string())
  27. }
  28. pub fn run_cci_cache(cci_arc: Arc<Mutex<CentralControlInfo>>) -> Arc<Mutex<CentralControlInfo>> {
  29. // cci缓存,防止中控因等待时间过长杀死rust
  30. let cci_cache = CentralControlInfo {
  31. now_balance: Default::default(),
  32. unrealized_pn_l: Default::default(),
  33. pos: Default::default(),
  34. entry_price: Default::default(),
  35. now_price: Default::default(),
  36. };
  37. let cci_cache_arc = Arc::new(Mutex::new(cci_cache));
  38. let cci_cache_arc_clone = cci_cache_arc.clone();
  39. tokio::spawn(async move {
  40. loop {
  41. tokio::time::sleep(Duration::from_secs(1)).await;
  42. let cci = cci_arc.lock().await;
  43. {
  44. let cci_cache = cci_cache_arc_clone.lock().await;
  45. cci_cache.now_price = cci.now_price;
  46. cci_cache.pos = cci.pos;
  47. cci_cache.unrealized_pn_l = cci.unrealized_pn_l;
  48. cci_cache.now_balance = cci.now_balance;
  49. cci_cache.entry_price = cci.entry_price;
  50. }
  51. }
  52. });
  53. return cci_cache_arc;
  54. }
  55. pub fn run_server(port: u32, running: Arc<AtomicBool>, cci_arc: Arc<Mutex<CentralControlInfo>>) {
  56. let addr = format!("0.0.0.0:{}", port);
  57. info!("中控绑定地址:{}", addr);
  58. // 启动server
  59. let arcs = Arcs {
  60. running: running.clone(),
  61. cci_cache_arc: run_cci_cache(cci_arc),
  62. };
  63. let server_fut = HttpServer::new(move || {
  64. let arcs_clone = arcs.clone();
  65. App::new()
  66. .app_data(web::Data::new(arcs_clone))
  67. .service(get_account)
  68. .service(on_change)
  69. })
  70. .bind(addr)
  71. .expect("Bind port error")
  72. .run();
  73. info!("中控服务已运行。");
  74. let r = running.clone();
  75. tokio::spawn(async move {
  76. server_fut.await.expect("error running the server");
  77. r.store(false, Ordering::Relaxed);
  78. });
  79. }