From 53d71c4bcb4927bdf5869cebab133cba1888dc7a Mon Sep 17 00:00:00 2001 From: GuanYuankai Date: Wed, 15 Oct 2025 15:07:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=80=E5=87=BA=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=9Apaho=20mqtt=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E4=BC=9A=E5=8A=AB=E6=8C=81sigint=E4=BF=A1=E5=8F=B7=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E9=80=80=E5=87=BA=E5=A4=B1=E8=B4=A5=EF=BC=8C?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E4=BF=AE=E6=94=B9=E9=80=80=E5=87=BA=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E4=BD=BF=E5=BE=97=E6=9C=8D=E5=8A=A1=E6=8B=A5?= =?UTF-8?q?=E6=9C=89=E4=B8=80=E4=B8=AA=E4=BC=98=E9=9B=85=E7=9A=84=E9=80=80?= =?UTF-8?q?=E5=87=BA=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 14 ++++---- src/main.cpp | 46 +++++++++++++++---------- src/modbus/modbus_rtu_poller_service.cc | 1 + src/web/web_server.cc | 2 -- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c5d31f..49becb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,14 +94,14 @@ target_link_libraries(edge_proxy PRIVATE # =================#================================================ # 测试目标 # ================================================================= -add_executable(test - src/test.cc - src/SQL/data_storage.cc +# add_executable(test +# src/test.cc +# src/SQL/data_storage.cc -) +# ) -target_link_libraries(test PRIVATE - edge_proxy_lib -) +# target_link_libraries(test PRIVATE +# edge_proxy_lib +# ) diff --git a/src/main.cpp b/src/main.cpp index 6b84345..c3675eb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,10 +22,10 @@ boost::asio::io_context g_io_context; /** * @brief 处理终止信号 (SIGINT, SIGTERM). */ -void signalHandler(int signum) { - spdlog::warn("Interrupt signal ({}) received. Shutting down.", signum); - g_io_context.stop(); -} +// void signalHandler(int signum) { +// spdlog::warn("Interrupt signal ({}) received. Shutting down.", signum); +// g_io_context.stop(); +// } /** * @brief 周期性轮询系统状态并发布到 MQTT @@ -60,8 +60,8 @@ int main(int argc, char* argv[]) { return 1; } - signal(SIGINT, signalHandler); - signal(SIGTERM, signalHandler); + // signal(SIGINT, signalHandler); + // signal(SIGTERM, signalHandler); try { MqttClient mqtt_client("tcp://mqtt-broker:1883", "edge-proxy-main-client"); @@ -112,21 +112,31 @@ int main(int argc, char* argv[]) { WebServer web_server(monitor, 8080); web_server.start(); + // --- 2. <<< MODIFIED: 设置 Boost.Asio 风格的信号处理器 >>> --- + boost::asio::signal_set signals(g_io_context, SIGINT, SIGTERM); + signals.async_wait([&](const boost::system::error_code& error, int signal_number) { + spdlog::warn("Interrupt signal ({}) received. Shutting down.", signal_number); + + // a. 首先停止所有数据采集线程 + spdlog::info("[Shutdown] A. Stopping device manager services..."); + device_manager.stop_all(); + + // b. 停止Web服务器线程 + spdlog::info("[Shutdown] B. Stopping web server..."); + web_server.stop(); + + // c. 断开MQTT连接 (这将释放它对io_context的'劫持') + spdlog::info("[Shutdown] C. Disconnecting from MQTT broker..."); + mqtt_client.disconnect(); + + // d. 最后,安全地停止io_context + spdlog::info("[Shutdown] D. Stopping main event loop..."); + g_io_context.stop(); + }); + spdlog::info("All services are running. Press Ctrl+C to exit."); g_io_context.run(); - // --- 清理工作 --- - spdlog::info("Shutting down MQTT client..."); - - spdlog::info("Stopping device manager services..."); - device_manager.stop_all(); - spdlog::info("Stopping web server..."); - web_server.stop(); - spdlog::info("Disconnecting from MQTT broker..."); - mqtt_client.disconnect(); - - // mqtt_client.disconnect(); - // web_server.stop(); } catch (const std::exception& e) { spdlog::critical("An unhandled exception occurred: {}", e.what()); diff --git a/src/modbus/modbus_rtu_poller_service.cc b/src/modbus/modbus_rtu_poller_service.cc index 3bbc486..abc5398 100644 --- a/src/modbus/modbus_rtu_poller_service.cc +++ b/src/modbus/modbus_rtu_poller_service.cc @@ -104,4 +104,5 @@ void ModbusRtuPollerService::run() { // 线程退出前关闭串口 m_client.closePort(); + spdlog::info("[RTU Poller {}] Run loop finished. Thread exiting.", m_config.device_id); } \ No newline at end of file diff --git a/src/web/web_server.cc b/src/web/web_server.cc index 93868bd..2748ee8 100644 --- a/src/web/web_server.cc +++ b/src/web/web_server.cc @@ -33,10 +33,8 @@ void WebServer::start() { } void WebServer::stop() { - // a. 停止Crow应用 m_app.stop(); - // b. 等待线程执行完毕 if (m_thread.joinable()) { m_thread.join(); }