程序订阅EMXQ的消息,程序没死消息收不到了

错误报告

环境

问题描述

我有一台设备,以每分钟1条的频率定时向 emqx 发送信息
我的程序是直接订阅当前 topic 然后解析数据写入 tdengine 并打印日志
程序中我 重写了 SetConnectionLostHandler SetOnConnectHandler 两个回调

预期行为

程序不被kill 掉,程序会一直接收信息并写入tdengine并在日志中打印

实际行为

程序刚运行时,一切符合预期,程序运行一段时间后(不知道多长时间), 程序还活着,收不到信息了
回调函数没有调用,日志中没有error输出,如果发送MQTT信息会出现 TIMEOUT 错误。

重启程序,恢复正常

程序多长时间会发生这个问题,我还没有找到规律,可能一两个小时,可能5,6个小时。


EMQX后台发现当前客户端客户端已经不在线了,后台也没有看到什么警告信息。
另外我还不知道怎么查看 EMQX的日志文件,所以我无法提供 emqx的日志。

客户端初始化代码

opts := mqtt.NewClientOptions()
opts.AddBroker(addr)
opts.SetClientID("sc_client" + "-" + strconv.FormatInt(time.Now().UnixNano(), 36))
opts.SetKeepAlive(10 * time.Second)
opts.SetMaxReconnectInterval(10 * time.Second)

opts.SetOnConnectHandler(...)
opts.SetConnectionLostHandler(...)

client = NewClient(opts)

请教一下,我该如何让程序正常运行

可以看下是不是你的程序没有及时发送心跳包导致 KeepAlive 超时连接被断开了。而且看你描述你的程序在连接断开后应该是没有重连机制的。

请问我该如何查看心跳包,或者说如何设置心跳包?

一般的 SDK 都支持你在连接时设置 KeepAlive 的,你可以去看一下它们提供的参数。

在我上面的客户端初始化代码中有

opts.SetKeepAlive(10 * time.Second)

如果我不设置该选项则心跳默认为 30 秒

可能需要你提供一下 EMQX 的日志,可以看这里:日志与追踪