2014-04-10 1 views
0

안녕하세요, 현재 Moco 프레임 워크 용 Arquillian 확장 프로그램 (https://github.com/dreamhead/moco)을 개발 중입니다. Moco는 RESTful 서비스를 테스트하는 데 사용되며 Netty를 사용하여 통신을 처리합니다. 현재 Moco는 Netty 4.0.18. 최종을 사용 중입니다.깨끗하게 Netty 서버 닫기

하지만 컨테이너 (Arquillian은 컨테이너 내에서 테스트가 실행 됨) 내부에서 Moco (및 Netty 서버)를 실행할 때 문제가 있음을 알았지 만 올바르게 시작되지만 응용 프로그램이 배포 취소되고 서버가 종료되면 다음에 오류 메시지가 표시됩니다. 인쇄 :

심각한 문제 : 웹 응용 프로그램 [/ ba32e781-3a18-44b3-9547-7c26787f3fe7]은 [pool-2-thread-1]이라는 스레드를 시작한 것으로 보이지만 중지하지 못했습니다. 이렇게하면 메모리 누수가 발생할 가능성이 큽니다. org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE : 웹 응용 프로그램 [/ ba32e781-3a18-44b3-9547-7c26787f3fe7]이 [io.netty 유형의 키가있는 ThreadLocal을 만들었습니다 .util.internal.ThreadLocalRandom $ 2] (값 [[email protected]]) 및 [io.netty.util.internal.ThreadLocalRandom] 유형의 값 (값 [io.netty.util. [email protected]]). 그러나 웹 응용 프로그램이 중지되었을 때이를 제거하지 못했습니다. 스레드는 시간 경과에 따라 갱신되어 가능한 메모리 누수를 피하려고 시도합니다.

기본적으로 서버가 종료하려고 할 때 아직 닫히지 않은 일부 스레드가있는 것으로 보입니다.

응용 프로그램이 서버에 배포 될 때 Arquillian 확장의 관점에서 Moco의 시작 메서드가 호출되고 응용 프로그램을 배포 취소하기 전에 Moco의 stop 메서드가 호출됩니다.

그러나 내가 당신에게 모코의 코드를 보여주지 : 같은

public int start(final int port, ChannelHandler pipelineFactory) { 
    ServerBootstrap bootstrap = new ServerBootstrap(); 
    bootstrap.group(bossGroup, workerGroup) 
      .channel(NioServerSocketChannel.class) 
      .childHandler(pipelineFactory); 

    try { 
     future = bootstrap.bind(port).sync(); 
     SocketAddress socketAddress = future.channel().localAddress(); 
     address = (InetSocketAddress) socketAddress; 
     return address.getPort(); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } 

및 정지 방법은 같습니다 그래서 보인다

private void doStop() { 
    if (future != null) { 
     future.channel().close().syncUninterruptibly(); 
     future = null; 
    } 

그 close 메소드가 반환 모든 스레드를 죽이는 전에 대한 이 이유는 컨테이너가 메모리 누수 가능성에 대해 경고합니다.

Netty를 사용한 적이 없기 때문에 전체 Netty 런타임이 닫혀 있는지 확인하는 방법이 있는지 궁금합니다.

도움을 주셔서 대단히 감사합니다.

답변

0

저는 Netty도 처음 사용하고 (Arquillian에 익숙하지 않습니다) Netty Docs 예제를 기반으로 작성한 EventLoopGroup (bossGroup, workerGroup)을 종료하지 않았을 수도 있습니다. Netty 4.0 User Guide :

Netty 응용 프로그램을 종료하는 것은 일반적으로 shutdownGracefully()을 통해 만든 모든 EventLoopGroups를 종료하는 것처럼 간단합니다. EventLoopGroup이 완전히 종료되고 그룹에 속한 모든 채널이 닫힌 경우 알려주는 Future를 반환합니다. 그물코의 문서에

private void doStop() { 
    workerGroup.shutdownGracefully(); 
    bossGroup.shutdownGracefully(); 
} 

예 :

그래서 doStop() 메소드처럼 보일 수 있습니다 Http Static File Server Example