You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:53:17