修改退出函数:paho mqtt客户端会劫持sigint信号,导致退出失败,现在修改退出函数,使得服务拥有一个优雅的退出流程
This commit is contained in:
parent
f7e676a87a
commit
53d71c4bcb
|
|
@ -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
|
||||
# )
|
||||
|
||||
|
||||
|
|
|
|||
46
src/main.cpp
46
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());
|
||||
|
|
|
|||
|
|
@ -104,4 +104,5 @@ void ModbusRtuPollerService::run() {
|
|||
|
||||
// 线程退出前关闭串口
|
||||
m_client.closePort();
|
||||
spdlog::info("[RTU Poller {}] Run loop finished. Thread exiting.", m_config.device_id);
|
||||
}
|
||||
|
|
@ -33,10 +33,8 @@ void WebServer::start() {
|
|||
}
|
||||
|
||||
void WebServer::stop() {
|
||||
// a. 停止Crow应用
|
||||
m_app.stop();
|
||||
|
||||
// b. 等待线程执行完毕
|
||||
if (m_thread.joinable()) {
|
||||
m_thread.join();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue