错误报告
环境
- EMQX 版本:开源版4.3.5
- 操作系统版本:centos8
重现此问题的步骤
开始的做法时,设备初次连接的时候,使用
timer = exproto_pb2.TimerRequest(conn=request.conn, type=exproto_pb2.TimerType.KEEPALIVE, interval=120)
response = self.stub.StartTimer(timer)
启动定时器将120*3s不发消息的设备踢掉。
我的设备是1分钟一条数据,但是当第四分钟数据收到解析完毕之后,通过
publish = exproto_pb2.PublishRequest(
conn=request.conn,
topic="/$sys/username/clientId/upload",
qos=1,
payload=json.dumps(data).encode("utf-8")
)
self.stub.Publish(publish)
发布的时候,会出现异常,显示
2023-03-03 15:59:00,588 ERROR:root:OnReceivedBytes
2023-03-03 15:59:00,588 ERROR:root:<_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "Socket closed"
debug_error_string = "{"created":"@1677830340.588034111","description":"Error received from peer ipv4:127.0.0.1:9100","file":"src/core/lib/surface/call.cc","file_line":1069,"grpc_message":"Socket closed","grpc_status":14}
看着像是连接关闭了,但是之后设备数据都是正常的,每4分钟出现一次这个异常,数据丢失。
我怀疑跟定时器有关,所以修改代码为每次发布完重新启动一次定时器,然后发现异常不再出现了。
预期行为
根据我之前的测试结果,这个定时器在设备链接上来,启动一次。当每次收到设备信息的时候,会重新刷新定时器的时间,所以根本不用我每次发布之后,重新使用定时器手动刷新。
实际行为
实际上,我使用其他的tcp连接工具进行测试的时候,也是正常的,但不知道为什么会出现这种异常,具体的原因没有找到。