阜蒙县建设学校网站是什么,软件发布网,湖北交投建设集团有限公司网站,旅游景区网络营销案例前提#xff1a;客户端和服务端基于websocket进行交互#xff0c;客户端每隔8s发送心跳#xff0c;服务端检测心跳#xff0c;超过三分钟没收到会关闭session。 现象#xff1a;客户端日志记录发送了心跳消息#xff0c;服务端没收到心跳#xff0c;超时后服务端关闭… 前提客户端和服务端基于websocket进行交互客户端每隔8s发送心跳服务端检测心跳超过三分钟没收到会关闭session。 现象客户端日志记录发送了心跳消息服务端没收到心跳超时后服务端关闭sessionA客户端新建了会话sessionB过了会又收到了之前sessionA的消息由于sessionA已经关闭所以isOpen 方法返回 false。 最开始并没有关注到sessionA在关闭后收到的消息所以一直以为是丢消息了服务端说是客户端的问题客户端说明明发送了消息日志都记录了。 当然现有消息交互方式也是有问题的客户端记录发送成功并不表明真的成功了所以靠谱的应该是加上业务层的ack客户端收到服务端的业务ack才真正的是表明消息发送成功了。现在介绍为什么会出现上面的现象。 客户端跟服务端是单会话形式所以被OnMessage标注的方法会依次触发什么意思客户端A往服务端发送了1、2、3三个消息服务端先处理1、处理完之后才会处理2然后是3。当然了session之间是并发的互不影响只是session内消息是一条一条执行。问题就在这如果消息1执行很慢时间超过3分钟而心跳消息2、3…由于得不到处理就会触发超时关闭session。 结论消息并没有丢而是由于消息处理时间太久导致后续消息得不到执行程序判断心跳超时 关闭了session。原因找到了怎么处理就比较容易了。