728x90
https://pendine.tistory.com/42
이글 내용을 뒤잇는 내용
EventLoop 가 제대로 등록 되지 않는것을 확인했음.
재접속시 EventLoop를 제대로 등록했는지 확인 후 제대로 등록돼지 않았으면 연결을 종료 후 재접속을 시도하도록 변경
적용 소스코드 내용 일부 발췌
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)");
setChangePort();
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() );
logger.info(" ID : {} | connectChannelFuture | bootStrap Connect result | isDone() : {} | isSuccess() : {} | isCancellable() : {} | isCancelled() : {} "
, ID
, connectChannelFuture.isDone()
, connectChannelFuture.isSuccess()
, connectChannelFuture.isCancellable()
, connectChannelFuture.isCancelled()
);
logger.info(" ID : {} | channel created after Check | not yet addListener Connection,Close Listenner | toString() : {} | isActive : {} | isOpen : {} | isWritable : {} | isRegistered : {} "
, ID
, connectChannelFuture.channel().toString()
, connectChannelFuture.channel().isActive()
, connectChannelFuture.channel().isOpen()
, connectChannelFuture.channel().isWritable()
, connectChannelFuture.channel().isRegistered()
);
접속 담당 객체에서 연결을 위해 가지고있는
( ChannelFuture ) connectChannelFuture 를 이용해서 이벤트 루프가 제대로 등록됐는지 확인하고 (isRegistered())
안됐다면 새로운 부트스트랩을 만들어준뒤 연결시도를 진행함.
혹시나 몰라서 접속 시도, 접속 종료시 앞뒤로 100ms 씩 대기하도록함. 무시해도 됨.
말도 안되는지는 모르겠지만 이해가 안된다
그전에 일주일동안 접속 제대로 되는지 집에 서버 열어놓고 회사노트북 들고다니면서 연결 되는지 안되는지 확인하려고 인터넷 끊었다 연결했다가 와이파이 연결했다가 끊었다가 별짓을 다했는데 왜 그동안 이런 문제가 발생을 안했지?
728x90
'Programming > JAVA' 카테고리의 다른 글
[JAVA/Netty] 클라이언트의 연결 종료 확인 (1) | 2023.01.17 |
---|---|
[Java] String 연산자 vs StringBuilder 연산자 (0) | 2022.12.24 |
[JAVA] 외부파일 값 변경하기 (0) | 2022.07.27 |
[java/websocket] TooTallNate/Java-WebSocket 웹소켓 메시지 사이즈 관련 (0) | 2022.07.14 |
[java/mybatis] 자바 spring boot DB쿼리 결과 일부만 null (0) | 2022.05.03 |
댓글