채널 close 후 nioEventLoopGroup 쓰레드 제거 관련 질문드립니다.

547 views
Skip to first unread message

신입개발자

unread,
Dec 8, 2020, 12:30:39 AM12/8/20
to Netty Korean User Group
안녕하세요. 네티를 이용해 스프링 위에서 클라이언트 프로그래밍을 하고 있습니다.

소켓을 하나 연결할떄마다 nioEventLoopGroup 쓰레드가 하나씩 생성되고있는데,
channel.close()를 해서 채널등록해제 이벤트(channelUnregistered) 까지 호출되어도 nioEventLoopGroup 쓰레드가 계속 살아있습니다.

어떻게 이 쓰레드를 종료시킬 수 있나요? 


위 이미지의 nioEventLoopGroup 1~4 까지의 쓰레드 들은 소켓 하나가 연결될때마다 생성되어 4개 모두 close 되었지만 쓰레드는 제거되지 않고있습니다...

아래는 클라이언트 소켓 연결 소스입니다.


Bootstrap b = new Bootstrap();

b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.option(ChannelOption.SO_KEEPALIVE, true)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
.handler(new ChannelInitializer<SocketChannel>() {

     @Override
     protected void initChannel(SocketChannel ch) throws Exception {
     ch.pipeline()
    .addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()))
     .addLast(new StringDecoder())
     .addLast(new StringEncoder())
     .addLast(new NettyClientHandler(phone));
     }
});

/* 소켓 연결 및 리스너 등록 */

b.connect(HOSTPORT)
.sync()
.addListener((ChannelFuture cf) -> {   
     clientList.add(phone); //연결된 클라이언트 리스트에 추가
   }
});



박신우우

unread,
Dec 8, 2020, 12:45:51 AM12/8/20
to nett...@googlegroups.com
종료처리해야 하는부분에서 
group.shutdownGracefully();

또는
b.group().shutdownGracefully();

처리를 하시면 됩니다.

2020년 12월 8일 (화) 오후 2:30, 신입개발자 <chmp...@gmail.com>님이 작성:
--
이 메일은 Google 그룹스 'Netty Korean User Group' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/netty-ko/60690dbb-23bc-428d-ac9c-8d47cdc48cd3n%40googlegroups.com을(를) 방문하세요.

신입개발자

unread,
Dec 8, 2020, 1:39:54 AM12/8/20
to Netty Korean User Group
group.shutdownGracefully();
또는
b.group().shutdownGracefully();
를 하게되면 연결되어 있던 소켓들이 모두 해제되더라구요.. 
현재 작성중인 프로그램은 스프링위에서 여러개의 클라이언트를 서버에 연결하고 관리하고 있습니다.

위에 클라이언트 연결 소스에서 빠진게 있는데 

EventLoopGroup group = new NioEventLoopGroup();

for(Client waitClient : waitClientList){
 //위 질문의 연결 소스 
}

이런식으로 연결해야하는 목록을 가져와서 하나의 EventLoopGroup 객체를 만들고
반복문을 돌면서 클라이언트 하나당 하나의 Bootstrap 객체를 생성 하지만 최초 생성한 EventLoopGroup을 사용하여 연결하고 있습니다.

예를들어 이렇게 10개의 소켓을 연결하면 EventLoopGroup 객체는 1개 Bootstrap 객체는 10개가 생성된것이고,
nioEventLoopGroup 1~10 까지의 스레드가 생성됩니다.
이 중 4개를 close 했다고 하면 6개의 쓰레드만 남아야 하는데 10개 모두 남아있는 상태입니다. 

혹시 클라이언트 하나의 연결마다 EventLoopGroup 객체를 하나씩 만들어줘야 하는 건가요?

2020년 12월 8일 화요일 오후 2시 45분 51초 UTC+9에 myhap...@gmail.com님이 작성:

박신우우

unread,
Dec 8, 2020, 2:48:18 AM12/8/20
to nett...@googlegroups.com
저 같은 경우에는 하나의 연결채널마다 연결 그룹을 별개로 만들고 통신 응답이 종료가 필요할때마다 shutdown시키는 방식으로 처리하였는데,
해당 방식으로는 구현해본적이 없어서 다른분들의 답이 필요할 것 같습니다. 말씀하신바와 같이 이벤트그룹을 셧다운시키면 모든 채널이 닫힐겁니다.

2020년 12월 8일 (화) 오후 3:39, 신입개발자 <chmp...@gmail.com>님이 작성:

SOOH LEE

unread,
Dec 8, 2020, 3:06:28 AM12/8/20
to Netty Korean User Group
음 제가 알기로 Netty의 경우, 
스레드 풀을 활용해서, 적은수의 스레드로 많은 수의 클라이언트를 처리하는 것을 목적으로 나온 프레임워크인데,
한번 스레드를 할당해둔다음, 그 할당한 스레드들로 처리를 하게끔 되어있는 방식이라 소켓의 연결이 끊겼다고 해서 
스레드의 수가 줄어들지는 않기 때문에.스레드의 갯수가 변하지 않는건 정상입니다.  
소켓(클라이언트) 하나마다 스레드가 할당되는 방식이라고 이해하신거라면 Netty에 대해서 좀더 공부해보시면 도움이 되실것으로 보입니다!


EventLoopGroup group = new NioEventLoopGroup();  

Bootstrap b = new Bootstrap();

b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAYtrue)
.option(ChannelOption.SO_KEEPALIVEtrue)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
.handler(new ChannelInitializer<SocketChannel>() {

     @Override
     protected void initChannel(SocketChannel ch) throws Exception {
     ch.pipeline()
    .addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()))
     .addLast(new StringDecoder())
     .addLast(new StringEncoder())
     .addLast(new NettyClientHandler(phone));
     }
});


위와같은 코드에서 EventLoopGroup은 스레드 풀이라고 생각하시면 되고,

Bootstrap 은 설정을 다루는 객체라고 생각하시면 됩니다.


그러므로, 클라이언트와의 연결마다 부트스트랩 객체를 생성할 이유는 특수한 경우가 아니면 거의 없을거 같고,

보통 channel 하나를 소켓하나라고 보기 때문에, 클라이언트 하나당 channel하나씩 이라고 이해하시면 좋을거라 생각합니다.


Bootstrap.connect함수를 호출해서, 반환되는 channel객체를 클라이언트마다 할당해서 사용하도록 로직을 변경해보시는 것을 추천드립니다.



2020년 12월 8일 화요일 오후 4시 48분 18초 UTC+9에 myhap...@gmail.com님이 작성:

신입개발자

unread,
Dec 10, 2020, 7:53:14 PM12/10/20
to Netty Korean User Group
감사합니다.!

2020년 12월 8일 화요일 오후 5시 6분 28초 UTC+9에 SOOH LEE님이 작성:
Reply all
Reply to author
Forward
0 new messages