안녕하세요, 현재 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 런타임이 닫혀 있는지 확인하는 방법이 있는지 궁금합니다.
도움을 주셔서 대단히 감사합니다.