서버에 대한 연결 시도시 channel Registered 의 False 조건 질문입니다.

105 views
Skip to first unread message

박세진

unread,
Sep 26, 2021, 9:49:35 PM9/26/21
to Netty Korean User Group
서버에 대한 재접속을 시도하는경우
간혹 재접속을 못하는 경우가 존재하여 이를 해결하기위해
channel의 Registered()가 False가 반환되는 조건 질문드립니다.

서버에 대한 접속을 유지하기 위해
재접속 코드를 
ChannelFutureListener클래스를 이용해서
channelFuture.channel().eventLoop().schedule( callableClient, config , TimeUnit.SECONDS);


연결, 연결 종료시 재접속을 위해 callableClient에서 
clientChannel = connectChannelFuture.addListener( connectListinner ).sync().channel()
                .closeFuture().addListener( closeListenner ).sync().channel();


테스트환경에서는 문제없이 재접속이 계속 잘되고
실환경에서도 재접속이 잘되다가 며칠에 한번꼴로 재접속이 안되서
접속시도, 접속종료, 주기적으로 채널의 상태를 체크하기위해서
channel의 isActive, isOpen, isWritable, isRegistered
channelFuture의 isSuccess, isDone, isCancelled, isCancellable
의 메소드를 확인해보니 
연결시도시 정상으로 판단할때 사용한 정보는 isActive만 사용했는데 

isActive는 True지만  isRegistered 가 False일때 재접속이 안되는 것 같아서요.
일주일간의 로그를 확인가능한데 지금 재접속이 안된경우는 이것밖에 확인이 안되는데다
테스트 환경에서 동일하게 isRegistered 가 False로 동작하게끔 하여
확인해보려고 하는데 어떻게 해야할까요?

지금 테스트는 Hercules 를 이용해서 
로컬호스트, 같은 망 내의 다른 호스트에 readIdle 시간 초과시 재접속을 하는 방법으로 하고있습니다..

Se-Jin Park

unread,
Sep 29, 2022, 5:14:57 AM9/29/22
to Netty Korean User Group
간혹 재접속을 못하는 현상을 확인했고
이 문제는 이벤트 루프가 제대로 등록되지 않아서 발생한 부분이었습니다.
do {
    connectChannelFuture = this.clientBootstrap.connect(addr);

    logger.debug("connect Channel Future | isRegistered() : {} | port : {}", connectChannelFuture.channel().isRegistered() , this.getPort() );
               
    try {
        new Thread().sleep(100);
        logger.info("wating 100 ms");
    }catch(Exception e ) {
        logger.error("wating ChannelFuture setting error | Exception Log : {} " , LogHelper.getPrintStackTrace(e));
    }
               
    if( !connectChannelFuture.channel().isRegistered() ) {
        try {
            connectChannelFuture.channel().close();
            logger.info(" not registered channel 닫음");
        }catch (Exception e ) {
            logger.error(" not registered channel 닫는중 오류. / Exception Log : {}" , LogHelper.getPrintStackTrace(e) );
        }
//        isRegistered가 false라면
//        ChannelEventLoop가 등록 안된상태
//        이벤트루프가 등록 안된상태에서 접속이 종료되면 접속 정보에 대한 재접속 동작이 실행되지 않음.
                   
        this.clientBootstrap = nettyBootstrapFactory.createBootstrap();
        logger.debug("connectChannelFuture | clientBootstrap.connect(addr)");
   
        try {
            new Thread().sleep(100);
            logger.info("wating 100 ms");
        } catch(Exception e ) {
            logger.error("wating ChannelFuture setting error | Exception Log : {} " , LogHelper.getPrintStackTrace(e));
        }                
    }else {
        logger.debug("connect Channel Future | isRegistered() : {} | port : {}", connectChannelFuture.channel().isRegistered() , this.getPort() );
        break;
    }        
} while( !connectChannelFuture.channel().isRegistered() );

연결시도를 하는 부분의 자체를 isRegistered가 true로 나올때까지
무한 반복하게 변경해서 해결했습니다.
2021년 9월 27일 월요일 오전 10시 49분 35초 UTC+9에 Se-Jin Park님이 작성:
Reply all
Reply to author
Forward
0 new messages