我们使用jetty 9.3.11版本的容器来部署我们的应用程序
我们正在使用tyrus客户端连接到我们已经部署的websocket服务器。
当我使用以下代码连接时:
WebSocket ws = null;
try {
ws = new WebSocketFactory().createSocket(server)
.addListener(new NotifierAdapter(userId, channel))
.addExtension(WebSocketExtension.PERMESSAGE_DEFLATE).connect();
} catch (WebSocketException we) {
connect(server, userId, channel);
}catch(Exception e)
{
e.printStackTrace();
}return ws;
大约8000个连接,我的机器占用了40%的内存
但是随着代码的修改(删除deflate扩展)
try {
ws = new WebSocketFactory().createSocket(server)
.addListener(new NotifierAdapter(userId, channel))
.connect();
} catch (WebSocketException we) {
connect(server, userId, channel);
}catch(Exception e)
{
e.printStackTrace();
}return ws;
仅使用15%的内存就能连接15000个连接即使在最新版本的Jetty服务器中,关于deflator是否有任何泄漏…
有没有办法在jetty的服务器端禁用PERMESSAGE_DEFLATE ..我们还使用spring websocket传递jetyrequestupgrade策略
Spring配置代码如下:@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@EnableWebSocket
public class WebMVCConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
private static final String NOTIFIER_ENDPOINT_URL = "/notificationHandler";
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(socketHandler(), NOTIFIER_ENDPOINT_URL).setAllowedOrigins("*");
}
@Bean
public WebSocketHandler socketHandler() {
return new NotificationSocketHandler();
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public DefaultHandshakeHandler handshakeHandler() {
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
policy.setInputBufferSize(8192);
policy.setIdleTimeout(600000);
WebSocketServerFactory ws=new WebSocketServerFactory(policy);
ws.getExtensionFactory().unregister("permessage-deflate");
return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(ws));
}
}
虽然我没有注册permessage-deflate,当我从浏览器连接到响应头,我可以看到这个标志仍然启用任何其他的变化应该在这个容器??
或者spring websocket配置有问题:
响应头也如下:
Connection:Upgrade
Sec-WebSocket-Accept:xbbUnu7pDWs9Q0st4T1LzsIfqao=
Sec-WebSocket-Extensions:permessage-deflate
Upgrade:WebSocket
我认为下面的错误还没有解决。
https://github.com/eclipse/jetty.project/issues/293是否有解决方法(在jetty服务器中显式配置以禁用jetty服务器容器或jetty spring配置中的PERMESSAGE_DEFLATE)
搜索后,我找不到任何解决方案服务器容器/代码配置与spring websocket不工作..
作为一个解决方案,我写了一个拦截器,它将从头中删除参数Sec Websocket扩展,以便服务器将发送没有此扩展名的响应
内存泄漏的原因是JVM类路径中Deflate实现的JVM错误。
设置ObjectPool只是延迟不可避免的,它只会减慢内存泄漏。
如果您有权访问WebSocketServletFactory
,那么…
factory.getExtensionFactory().unregister("permessage-deflate");
如果您只能通过JSR-356访问,那么实现一个自定义配置器,并在扩展协商期间剥离permessage-deflate扩展。
public class StripExtensionsConfigurator extends ServerEndpointConfig.Configurator
{
@Override
public List<Extension> getNegotiatedExtensions(List<Extension> installed,
List<Extension> requested)
{
return Collections.emptyList();
}
}