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发现功能正常。

相关推荐
NE_STOP3 天前
springMVC-HTTP消息转换器与文件上传、下载、异常处理
spring
JavaGuide3 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
玹外之音3 天前
Spring AI MCP 实战:将你的服务升级为 AI 可调用的智能工具
spring·ai编程
来一斤小鲜肉3 天前
Spring AI入门:第一个AI应用跑起来
spring·ai编程
NE_STOP4 天前
springMVC-常见视图组件与RESTFul编程风格
spring
what丶k4 天前
Spring AI 多模态开发全解析:从入门到企业级落地
后端·spring·ai编程
追风筝的人er4 天前
企业管理系统如何实现自定义首页与千人千面?RuoYi Office 给出了完整方案
vue.js·spring boot·spring cloud
NE_STOP4 天前
springMVC-获取前端请求的数据与三个作用域
spring
莫寒清4 天前
Spring MVC:@PathVariable 注解详解
java·spring·mvc