修改退出函数:paho mqtt客户端会劫持sigint信号,导致退出失败,现在修改退出函数,使得服务拥有一个优雅的退出流程

This commit is contained in:
GuanYuankai 2025-10-15 15:07:33 +08:00
parent f7e676a87a
commit 53d71c4bcb
4 changed files with 36 additions and 27 deletions

View File

@ -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
# )

View File

@ -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());

View File

@ -104,4 +104,5 @@ void ModbusRtuPollerService::run() {
// 线程退出前关闭串口
m_client.closePort();
spdlog::info("[RTU Poller {}] Run loop finished. Thread exiting.", m_config.device_id);
}

View File

@ -33,10 +33,8 @@ void WebServer::start() {
}
void WebServer::stop() {
// a. 停止Crow应用
m_app.stop();
// b. 等待线程执行完毕
if (m_thread.joinable()) {
m_thread.join();
}