最近發現Websocket發送超過6w個字節的時候就會自動斷開鏈接,前端控制檯沒有報錯信息,Websocket後端也沒有報錯信息,這就迷了。網上一搜,方案大體兩種:消息分片和調整消息限制長度。消息分片不考慮,那麼只有調整消息限制長度的方案。前端
在Websocket的配置中,定義Container的配置。java
@Configuration @EnableWebSocket public class WebsocketConfiguration implements WebSocketConfigurer { private static final int MAX_MESSAGE_SIZE = 20 * 1024; private static final long MAX_IDLE = 60 * 60 * 1000; @Bean public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() { ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); container.setMaxTextMessageBufferSize(MAX_MESSAGE_SIZE); container.setMaxBinaryMessageBufferSize(MAX_MESSAGE_SIZE); container.setMaxSessionIdleTimeout(MAX_IDLE); return container; } }
可是仍是沒有起到做用,Websocket依然斷開。
注意:MAX_MESSAGE_SIZE不該設置過大,不然創建鏈接頻繁申請過大的空間容易致使內存溢出
參考:websocket影響內存泄漏的兩個點
TOMCAT websocket 多鏈接內存泄漏與jetty對比分析nginx
在排查日誌的時候,發現Spring Cloud Gateway報錯了,以下:web
io.netty.handler.codec.CorruptedFrameException: Max frame length of 65536 has been exceeded.
這Gateway也來插一腳,大體就是推送的消息長度不能超過65536字節。
具體解決方法,上網了一下,參考http://www.javashuo.com/article/p-yakytrvc-nr.html。Websocket發送消息沒有再斷開,但只解決了發送期間消息長度的問題,在Websocket創建鏈接的時候,發送的消息超過6w個字節照樣出錯。後端
這個和上面的解決不同,替換初始化的Bean比較困難,最後經過修改源碼來進行調整長度的限制。主要修改的是HttpServerWSOperations這個類的初始化時,增長WebSocketServerHandshakerFactory 的maxFramePayloadLength的參數。修改完後,從新打包,覆蓋原來項目依賴的Jar包。
tomcat
其實,若是你不是必定要Gateway來轉發Websocket的話,能夠直接用nginx轉發Websocket到對應的服務,那就沒有Gateway轉發限制的煩惱了。若是不用Gateway轉發,那麼只須要第一步設置就好了,第二第三步都不須要。websocket