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。原因找到了,怎么处理就比较容易了。

相关推荐
GitLqr5 分钟前
玩转 WebSocket:从原理到 Flutter 实战
websocket·网络协议·flutter
大模型码小白1 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司2 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地3 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
HLC++3 小时前
Linux的进程间通信
android·linux·服务器
白露与泡影4 小时前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
莫逸风5 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
神奇霸王龙5 小时前
Claude Code屠榜:MiMo与Grok紧追Codex
服务器·网络·人工智能·gpt·ai·ai编程
Web极客码5 小时前
WordPress SEO优化:提升网站排名的13个关键步骤
服务器·seo·wordpress
z123456789866 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程