升级websocket-jetty-server至11.0.12后连接2分钟断开问题咨询
WebSocketIdleTimeoutException 排查与解决(Jetty 11.0.12 + Java 17)
针对你升级Jetty WebSocket到11.0.12适配Java17后,RHEL环境下2分钟触发org.eclipse.jetty.websocket.api.exceptions.WebSocketTimeoutException但Ubuntu正常的问题,从以下几个方向排查:
1. 调整Jetty的空闲超时配置
Jetty 11默认的WebSocket会话空闲超时为120秒(正好对应你的2分钟断开时间),Ubuntu环境可能之前有自定义配置未迁移,或者本地测试时会话有心跳包维持。可以通过代码或配置文件修改超时时间:
- 代码方式:获取
WebSocketServerContainer后设置超时,单位毫秒:
import org.eclipse.jetty.websocket.server.WebSocketServerContainer; import jakarta.websocket.server.ServerContainer; // 在WebSocket初始化时设置 ServerContainer container = (WebSocketServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); container.setDefaultMaxSessionIdleTimeout(300000); // 设置为5分钟,按需调整
- 配置文件方式:如果使用Jetty的xml配置,在
jetty-websocket.xml中添加:
<Set name="maxIdleTimeout">300000</Set>
2. 排查RHEL的网络层超时限制
RHEL的防火墙、TCP内核参数可能比Ubuntu严格,导致连接提前被断开:
- 检查TCP Keepalive参数:执行
sysctl net.ipv4.tcp_keepalive_time查看当前值,默认是7200秒(2小时),但部分环境会缩短。临时调整可以用:
sysctl -w net.ipv4.tcp_keepalive_time=600 # 设置为10分钟,按需调整
要持久化修改,将net.ipv4.tcp_keepalive_time=600写入/etc/sysctl.conf,然后执行sysctl -p生效。
- 检查防火墙超时:如果使用firewalld,查看当前超时设置:
firewall-cmd --list-all
如果存在短于业务需求的超时,调整全局超时:
firewall-cmd --set-timeout=300s --permanent firewall-cmd --reload
3. 确认Java 17的网络属性差异
Java 17对网络相关的默认参数有调整,可通过JVM启动参数显式指定超时:
-Djdk.net.http.client.idleTimeout=300 # 单位秒,设置为5分钟
同时确保项目依赖完整,Java 17的模块系统没有遗漏Jetty WebSocket所需的模块(如果使用模块化项目)。
4. 开启Jetty调试日志定位根因
在RHEL环境开启Jetty WebSocket的DEBUG日志,查看超时触发的具体细节:
- 在日志配置中添加:
org.eclipse.jetty.websocket=DEBUG
通过日志可以确认是服务器端因空闲主动断开,还是网络层面的连接中断,进一步缩小排查范围。
内容的提问来源于stack exchange,提问作者Umair Sayed
相关产品推荐
相关产品推荐

