SpringCloud处理Websocket消息过长自动断开连接

SpringCloud处理Websocket消息过长自动断开连接

问题描述

近期实现了客户端订阅Websocket后,服务端定期向客户端推送相关设备消息的功能,在本地测试没有问题,上线后却发现订阅设备数量超过一定数量后Websocket就会自动断开连接

报错日志

tex 复制代码
java.lang.IllegalStateException: Message will not be sent because the WebSocket session has been closed
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:449) ~[tomcat-embed-websocket-9.0.79.jar:9.0.79]
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:307) ~[tomcat-embed-websocket-9.0.79.jar:9.0.79]
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:249) ~[tomcat-embed-websocket-9.0.79.jar:9.0.79]
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:191) ~[tomcat-embed-websocket-9.0.79.jar:9.0.79]
	at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendObject(WsRemoteEndpointImplBase.java:614) ~[tomcat-embed-websocket-9.0.79.jar:9.0.79]
	at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendObject(WsRemoteEndpointBasic.java:72) ~[tomcat-embed-websocket-9.0.79.jar:9.0.79]
	at tbea.websocket.SubscribeDeviceParamWebSocketServer.lambda$scheduleMessagePush$2(SubscribeDeviceParamWebSocketServer.java:305) ~[classes/:na]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_301]
	at java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:308) ~[na:1.8.0_301]
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java) ~[na:1.8.0_301]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_301]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[na:1.8.0_301]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_301]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_301]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_301]

问题排查

经过排查发现当Websocket服务段推送消息数据大小在50kb左右时功能正常,此时再增加订阅一个设备时,线上Websocket就会自动断开连接,这时候很容易想到可能是Websocket推送消息可能又大小限制,当消息超过64kb的时候可能会自动断连。

然而我在本地测试发现消息数据大小远远超过64kb,仍然没有断连,客户端依旧可以收到消息。

这时发现我本地测试时,直接调用的是提供该功能服务的端口,而线上调用的是网关(gateway),再次测试发现,通过网关订阅Websocket时消息数据大小超过64kb时确实会自动断连。

解决方法

知道问题原因之后,直接通过搜索引擎发现Spring Cloud Gateway可以通过spring.cloud.gateway.httpclient.websocket.max-frame-payload-length配置来修改消息体的大小限制

修改gateway配置文件如下:

yaml 复制代码
spring:
  cloud:
    gateway:
      httpclient:
        websocket:
          # websocket数据包最大字节数
          max-frame-payload-length: 6553600

修改配置文件后,重新部署gateway发现功能正常。

相关推荐
程序猿零零漆1 小时前
SpringCloud系列教程:微服务的未来(二十)Seata快速入门、部署TC服务、微服务集成Seata
java·spring·spring cloud·微服务
Miketutu11 小时前
Spring MVC消息转换器
java·spring
小小虫码13 小时前
项目中用的网关Gateway及SpringCloud
spring·spring cloud·gateway
weisian15117 小时前
消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)
websocket·网络协议
带刺的坐椅18 小时前
无耳科技 Solon v3.0.7 发布(2025农历新年版)
java·spring·mvc·solon·aop
精通HelloWorld!21 小时前
使用HttpClient和HttpRequest发送HTTP请求
java·spring boot·网络协议·spring·http
LUCIAZZZ1 天前
基于Docker以KRaft模式快速部署Kafka
java·运维·spring·docker·容器·kafka
拾忆,想起1 天前
如何选择Spring AOP的动态代理?JDK与CGLIB的适用场景
spring boot·后端·spring·spring cloud·微服务
鱼骨不是鱼翅1 天前
Spring Web MVC基础第一篇
前端·spring·mvc
hong_zc1 天前
Spring MVC (三) —— 实战演练
java·spring·mvc