mod json_db_utils; mod control_c; mod server; mod listener_tools; mod binance_usdt_swap_data_listener; mod gate_usdt_swap_data_listener; mod coinex_usdt_swap_data_listener; mod msv; mod rank; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; use tracing::{info, warn}; use tracing_appender_timezone::non_blocking::WorkerGuard; // 日志级别配置 fn log_level_init(log_str: String, port: u32, app_name: String) -> WorkerGuard { info!("日志级别读取成功:{}。", log_str); global::log_utils::final_init(log_str.as_str(), port, app_name) } #[tokio::main(flavor = "multi_thread")] async fn main() { // 日志级别配置 let _ = log_level_init("info".to_string(), 28888, "micro_rank".to_string()); // 掌控全局的关闭 let running = Arc::new(AtomicBool::new(true)); // 初始化数据服务器 server::run_server(28888, running.clone()); // ctrl c退出检查程序 control_c::exit_handler(running.clone()); // 启动各交易所的数据监听器 binance_usdt_swap_data_listener::run_listener(running.clone()).await; gate_usdt_swap_data_listener::run_listener(running.clone()).await; coinex_usdt_swap_data_listener::run_listener(running.clone()).await; // panic错误捕获,panic级别的错误直接退出 // let panic_running = running.clone(); std::panic::set_hook(Box::new(move |panic_info| { let msg = format!("type=panic, msg={:?}, location={:?}", panic_info.to_string(), panic_info.location()); warn!("{}", msg); // panic_running.store(false, Ordering::Relaxed); })); // 每一秒检查一次程序是否结束 while running.load(Ordering::Relaxed) { tokio::time::sleep(Duration::from_secs(1)).await; } }