반응형

myhappyman.tistory.com/189

 

Netty Client 튜토리얼 - 02 (메시지별 보내고 받고 끊기)

myhappyman.tistory.com/187 Netty - Netty Client 튜토리얼 - 01 TCP 통신 해야하는 경우 JAVA SOCKET을 통해 서버를 구성하거나 클라이언트 소스를 구성하여 연결을 하고 메시지를 주고 받고 종료하고 데이터를..

myhappyman.tistory.com

2장에 메시지를 주고 받고 연결을 종료하는 로직을 구성하여 봤는데, 연결한 상태에서 서버측에서 응답이 없게 되면 무기한으로 채널이 열리는 상황이 생기게 될 것입니다.

이런 경우 일정시간 체크 후에도 응답이 없으면 닫도록 처리하는 방식

 

서버측이 닫혀있거나 네트워크 문제등으로 서버측에 연결이 안되었을경우 여러번 시도 하거나 시도회수가 초과하면 종료하는 처리를 해보겠습니다.

 

서버가 열릴 때까지 요청하기

ChannelFuture 인터페이스에서 I/O처리를 담당하고 이벤트 추가 또는 연결되었는지 실패하였는 등 메소드를 통해 결과를 알 수 있습니다.

private Bootstrap bs = new Bootstrap();

bs.group...
...
...

//옵션 처리가 끝난 후 연결처리
bs.connect(addr_).addListener(new ChannelFutureListener() {
	public void operationComplete(ChannelFuture future) throws Exception {
		if(future.isSuccess()) {
			logger.info("연결 성공");
			logger.info(addr_ + " connect()");
			channel_ = future.channel();
		}else {
			logger.info("연결 실패");
			future.channel().close(); //실패하면 기존 연결을 종료하고
			bs.connect(addr_).addListener(this); //재연결 처리를 한다.
		}
	}
});

addListener메소드를 통해 작업 리스너를 추가하고 ChannelFutureListener 인터페이스를 추가하여 콜백 메소드 operationComplete를 상속받습니다.

 

operationComplete 메소드는 연결 처리 후 서버와의 상태값을 얻어 올 수 있는데, isSuccess메소드의 return값이 true면 연결 성공, false면 연결 실패처리가 됩니다.

 

실패한 경우 기존 채널을 종료하고 재연결 시도를 하도록 구성하였습니다.

이후에는 서버가 동작할때까지 연결 시도를 하는 것을 볼 수 있습니다.

 

서버가 열릴때까지 시도를 한다.

 

n회미만까지 연결 시도하기

시도 횟수를 처리할 변수와 제한을 둘 상수를 추가하여 if문을 통해 처리가 가능합니다.

private int fail_cnt = 0;
private final int FAIL_COUNT_LIMIT = 3;

bs...
...
...

bs.connect(addr_).addListener(new ChannelFutureListener() {
	public void operationComplete(ChannelFuture future) throws Exception {
		if(future.isSuccess()) {
			logger.info("연결 성공");
			logger.info(addr_ + " connect()");
			channel_ = future.channel();
		}else {
			future.channel().close(); //실패하면 기존 연결을 종료하고
			if(FAIL_COUNT_LIMIT > ++fail_cnt) {
				logger.info("연결 실패 " + fail_cnt + "/" + FAIL_COUNT_LIMIT);
				bs.connect(addr_).addListener(this); //재연결 처리를 한다.
			}else {
				logger.info(FAIL_COUNT_LIMIT + "회 연결 초과");
				bs.group().shutdownGracefully(); //eventLoop에 등록된 Thread를 종료 처리한다.
			}
		}
	}
});

성공하였을 경우에는 연결처리를 하고, 실패하였을 경우 count를 체크하도록 하였습니다.

N회까지 시도 후 실패하면 더이상 요청하지 않는다.

반응형