概述
当前springboot
版本:2.7.4
使用依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
现象概述:
客户端和服务端已经有心跳连接正常ping,pong
.
服务端发送大报文给客户端时,当经过心跳间隔,chrome(客户端)
中提示websocket
连接已被关闭。
此时打开chrome
的network
查看ws
报文发送情况,发现服务端并没有推送报文过来。
这个时候就怀疑是服务端在某个异常情况下关闭了连接
排查经过
先查看websocket
服务端的tomcat
日志,并没有发现可疑的日志,只看到在调用sendMessage
前的一个log.info
日志。
那么此时就准备开始调试了,进入发送消息的地方,发现有个超时时间
org.apache.tomcat.websocket.WsRemoteEndpointImplBase#sendMessageBlock(java.nio.CharBuffer, boolean)
点进去后,看到默认是 20s + 当前时间戳
然后发送的时候比较当前发送的总时间是否已经超过20s
,如果超过则直接关闭连接。
org.apache.tomcat.websocket.WsRemoteEndpointImplBase#sendMessageBlock(byte, java.nio.ByteBuffer, boolean, long)