WildFly 29中Jakarta WebSocket Server 90秒后异常断开问题求助
排查WildFly 29上WebSocket升级jakarta后90秒异常断开(1006错误)的方向
检查WildFly的WebSocket空闲超时配置
WildFly默认WebSocket会话空闲超时为90秒(90000毫秒),升级jakarta后可能未调整该配置。- 查看
standalone.xml/domain.xml中undertow子系统的websocket-container配置:
根据业务需求调整<subsystem xmlns="urn:jboss:domain:undertow:22.0"> <server name="default-server"> <!-- ... 其他配置 ... --> </server> <websocket-container name="default" max-session-idle-timeout="90000"/> </subsystem>max-session-idle-timeout值(比如设为3600000表示1小时)。 - 用JBoss CLI查询当前配置:
/subsystem=undertow/websocket-container=default:read-resource(include-runtime=true)
- 查看
验证心跳(Ping/Pong)机制有效性
1006错误常因空闲超时触发,需确认心跳逻辑在jakarta环境下正常工作:- 服务器端需定时发送Ping帧维持连接,示例代码:
@ServerEndpoint("/inventory-updates") public class InventoryUpdatesEndpoint { private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); @OnOpen public void onOpen(Session session) { scheduler.scheduleAtFixedRate(() -> { try { session.getAsyncRemote().sendPing(ByteBuffer.wrap(new byte[0])); } catch (IOException e) { // 处理异常,比如关闭会话 session.close(); } }, 30, 30, TimeUnit.SECONDS); } @OnClose public void onClose(Session session) { scheduler.shutdown(); } } - 确认客户端正确响应Ping帧返回Pong,否则服务器会判定会话空闲并断开。
- 服务器端需定时发送Ping帧维持连接,示例代码:
排查代码升级的兼容性问题
确保所有WebSocket相关API完全从javax.websocket迁移到jakarta.websocket:- 检查所有注解(
@ServerEndpoint、@OnOpen等)、类(Session、CloseReason)、方法是否替换为jakarta包路径,无残留的javax引用。 - 验证
@OnError方法是否正确捕获jakarta.websocket.DeploymentException、IOException等异常,避免未处理的异常导致连接异常断开。 - 对比升级前后
Session的使用逻辑,确认getBasicRemote()、getAsyncRemote()等方法的行为符合预期。
- 检查所有注解(
开启详细日志定位问题
开启Undertow和WebSocket的DEBUG级日志,获取断开前的详细错误信息:- 在
standalone.xml中添加/修改日志配置:<subsystem xmlns="urn:jboss:domain:logging:8.0"> <!-- ... 其他日志配置 ... --> <logger category="io.undertow.websockets"> <level name="DEBUG"/> </logger> <logger category="jakarta.websocket"> <level name="DEBUG"/> </logger> </subsystem> - 重启服务器后,查看
server.log或localhost.log,重点关注断开前的异常堆栈、超时警告等信息。
- 在
验证客户端与抓包分析
- 用不同客户端测试(如浏览器原生WebSocket、wscat命令行工具),确认是否所有客户端都出现90秒断开问题,排除客户端自身故障。
- 用浏览器开发者工具(Network标签)或Wireshark抓包,查看WebSocket帧交互过程,确认断开前是否有服务器发送的Close帧,或因无心跳导致的超时断开。
内容的提问来源于stack exchange,提问作者Roopam
相关产品推荐
相关产品推荐

