java websocket服务端丢消息

前提:客户端和服务端基于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。原因找到了,怎么处理就比较容易了。

相关推荐
阿巴~阿巴~1 分钟前
从帧到包:深入解析链路层与局域网通信的核心机制
服务器·网络·网络协议·tcp/ip·智能路由器·mac·数据链路层
周末吃鱼3 分钟前
研发快速使用JMeter
java·jmeter
EntyIU4 分钟前
自己实现mybatisplus的批量插入
java·后端
rfidunion9 分钟前
ubuntu下使用qemu模拟ARM(一)-------安装samba服务器
服务器·arm开发·ubuntu
小途软件15 分钟前
基于深度学习的人脸检测算法研究
java·人工智能·pytorch·python·深度学习·语言模型
回忆是昨天里的海15 分钟前
dockerfile-镜像分层机制
linux·运维·服务器
翼龙云_cloud16 分钟前
阿里云渠道商:阿里云弹性伸缩有哪几种
服务器·阿里云·云计算
双层吉士憨包18 分钟前
如何安全访问 Kickass Torrents:代理选择、设置与最佳实践(2026)
运维·服务器
爱宇阳19 分钟前
Windows 通过 SSH 下载服务器目录并完整上传到指定服务器目录(scp / rsync 实战教程)
服务器·windows·ssh
JY.yuyu23 分钟前
Windows Server服务器数据备份 / 活动目录(AD域)
运维·服务器