2016-09-16 9 views
1

Мы используем молы версию 9.3.11 Версии контейнер пристани для развертывания нашего приложенияИспользования PERMESSAGE_DEFLATE вызывая нативную утечку памяти в JETTY9.3.11

мы используем клиент Тира для подключения клиента к серверу 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% памяти

Но с прицелом модификации кода (удаление выкачать расширение)

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; 

Был способен подключаться к 15000 соединениям с 15% -ой памятью Есть ли утечка с соответствующими выпрямителями даже в последней версии J сервер Этти ..

Есть ли способ отключить PERMESSAGE_DEFLATE в серверной стороне причала .. Также мы используем пружинный WebSocket прохождения СТРАТЕГИИ jettyrequestupgrade

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)); 
    } 

} 

Хотя я сделал un register of permessage-deflate, когда я подключаюсь из браузера в заголовке ответа, я вижу, что этот флаг по-прежнему включен, любые другие изменения должны быть сделаны в контейнере для этого?

Или есть какие-либо проблемы с конфигурацией пружины WebSocket:

Также заголовок ответа выглядит следующим образом:

Connection:Upgrade 
Sec-WebSocket-Accept:xbbUnu7pDWs9Q0st4T1LzsIfqao= 
Sec-WebSocket-Extensions:permessage-deflate 
Upgrade:WebSocket 

Я думаю, что ошибка ниже Havent решен.

https://github.com/eclipse/jetty.project/issues/293

Есть ли обходной путь для этого (Explicit конфигурации в молы сервере отключить PERMESSAGE_DEFLATE в молы сервера контейнера или пружинной конфигурации для Jetty

После поиска я не смог найти какое-либо решение на контейнере сервера конфигурации/код с пружинным websocket не работал.

Как обходной путь я написал перехватчик, который удалит параметр Sec Websocket entension из заголовка .. так что этот сервер отправит ответ без этого расширения

ответ

2

Причина утечки памяти - ошибка JVM с реализациями Deflate в пути JVM Classpath.

Настройка ObjectPool просто задерживает неизбежное, это просто замедлит утечку памяти.

Если у вас есть доступ к WebSocketServletFactory тогда ...

factory.getExtensionFactory().unregister("permessage-deflate"); 

Если у вас есть доступ через JSR-356 только, а затем реализовать пользовательский конфигуратор и полосы расширения permessage-выкачать в ходе переговоров расширения.

public class StripExtensionsConfigurator extends ServerEndpointConfig.Configurator 
{ 
    @Override 
    public List<Extension> getNegotiatedExtensions(List<Extension> installed, 
                List<Extension> requested) 
    { 
     return Collections.emptyList(); 
    } 
} 
+0

Я уже сделал незарегистрированную версию этого расширения. Политика WebSocketPolicy = новая WebSocketPolicy (WebSocketBehavior.SERVER); policy.setInputBufferSize (8192); policy.setIdleTimeout (600000); WebSocketServerFactory ws = new WebSocketServerFactory (политика); ws.getExtensionFactory(). Unregister ("permessage-deflate"); return new DefaultHandshakeHandler (новая версия JettyRequestUpgradeStrategy (ws)); –

+0

Поскольку мы делаем unregister на websocketServerFactory, он должен отключить дефлят разрешения, но с указанным выше кодом, указанным также в браузере Chrome, я все еще вижу Connection: Upgrade Sec-WebSocket-Accept: xbbUnu7pDWs9Q0st4T1LzsIfqao = Sec-WebSocket-Extensions: permessage -deflate..может ли вы предоставить любое прерывание работы в контейнере сервера (конфигурации сервера причала) –

+0

Также есть ли что-либо подобное в контейнере контейнера-пристани (не приложение) http://stackoverflow.com/questions/28894316/tomcat- jsr356-websocket-disable-permessage-deflate-compression –