first commit
This commit is contained in:
parent
4d5514d8a9
commit
61e267dece
@ -3,6 +3,7 @@
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <algorithm>
|
||||
|
||||
std::shared_ptr<MQTTClient> mqtt_client;
|
||||
std::atomic<bool> mqtt_restart_required{false};
|
||||
@ -33,7 +34,7 @@ static void send_heartbeat()
|
||||
mqtt_client->publish(g_app_config.mqtt.topics.heartbeat_up, msg.dump());
|
||||
}
|
||||
|
||||
// MQTT 回调定义
|
||||
// MQTT 回调
|
||||
static void on_mqtt_connected()
|
||||
{
|
||||
LOG_INFO("[MQTT] Connected to broker: " + g_app_config.mqtt.server_ip);
|
||||
@ -220,10 +221,14 @@ void mqtt_client_thread_func()
|
||||
{
|
||||
}
|
||||
|
||||
// 更频繁地检查退出标志
|
||||
// 拆分等待,及时响应退出
|
||||
for (int i = 0; i < 10 && g_running && !mqtt_client->isConnected(); i++)
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||
|
||||
if (!g_running && mqtt_client->isConnected() == false)
|
||||
{
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
||||
mqtt_client->force_disconnect();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -233,33 +238,31 @@ void mqtt_client_thread_func()
|
||||
{
|
||||
send_heartbeat();
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
catch (...)
|
||||
{
|
||||
LOG_ERROR("[MQTT] Heartbeat error: " + std::string(e.what()));
|
||||
}
|
||||
// 将长睡眠拆分为多个短睡眠,以便更频繁检查退出标志
|
||||
|
||||
auto sleep_time = heartbeat_interval;
|
||||
while (sleep_time.count() > 0 && g_running && mqtt_client->isConnected())
|
||||
{
|
||||
auto chunk = std::min(sleep_time, std::chrono::milliseconds(200));
|
||||
auto chunk = std::min(sleep_time, std::chrono::milliseconds(50));
|
||||
std::this_thread::sleep_for(chunk);
|
||||
sleep_time -= chunk;
|
||||
}
|
||||
}
|
||||
|
||||
// 清理资源
|
||||
if (mqtt_client)
|
||||
if (!g_running && mqtt_client->isConnected())
|
||||
{
|
||||
// 只有在运行标志仍然为true时才尝试正常断开
|
||||
if (g_running)
|
||||
{
|
||||
mqtt_client->disconnect();
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果正在退出,直接重置客户端,不等待断开完成
|
||||
mqtt_client->force_disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
// 清理客户端
|
||||
if (mqtt_client)
|
||||
{
|
||||
if (g_running)
|
||||
mqtt_client->disconnect();
|
||||
else
|
||||
mqtt_client->force_disconnect();
|
||||
mqtt_client.reset();
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user