본문 바로가기
Programming/JAVA

[JAVA / Netty] 클라이언트 재접속 오류 해결

by Pendine 2022. 9. 21.
728x90

https://pendine.tistory.com/42

 

[JAVA / Netty] 클라이언트 오류 해결

뭔가 찜찜하긴한데 해결된것같음 기존 소스코드에서 바꾼건 하나도 없음 일주일 이상을 테스트했고 어떤 상황에서도 문제없이 돌아갔었던 코드라 아무런 문제가 없었음.  리눅스 OS 에서 동작

pendine.tistory.com

이글 내용을 뒤잇는 내용

 

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

댓글