记一次WebSocket的CLOSE_WAIT问题解决

这几天发现线上的服务器有很多CLOSE_WAIT的连接,导致新的请求接不进来。

问题原因

经排查,是WebSocket连接没有正常关闭引起的。

问题解决

直接贴代码:

1
2
3
4
5
6
7
8
9
10
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
var container = new ServletServerContainerFactoryBean();
container.setMaxSessionIdleTimeout(...);
return container;
}
}

解决方法来自这里

这是设置超时关闭,设置完运行了两天发现情况有所好转,但还是存在CLOSE_WAIT的问题,于是开始重检代码。

经过jstack大法重检,发现问题在于服务端把所有的WebSocket连接放在一个Hashtable中。在高并发场景下,Hashtable撑不住了。

Hashtable换成ConcurrentHashMap,问题解决。