문득 아래와 같은 Netty 의 일반적인 TCP Client 연결 코드에서 Timeout 옵션을 Integer.MAX_VALUE 로 설정하면 무한히 연결 재시도를 수행하지 않는지 궁금증이 생겼습니다. Integer.MAX_VALUE (2147483647) 값을 사용하면 68년(2147483647 / 60(초) / 60(분) / 24(시간) / 365(일)) 동안은 재연결을 수행할 테니 무한히 하는 것이라고 봐도 무방하다고 생각했습니다.
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
bootstrap.group(eventLoopGroup)
.channel(NioSocketChannel.class)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, Integer.MAX_VALUE)
.handler(channelInitializer);
bootstrap.connect("192.168.10.111", 24).sync();
저희는 특정 장비가 껏다 켜져도 항상 자동으로 연결되도록 하기 위해 주기적으로 연결을 재시도하는 아래와 같은 코드를 작성해서 사용하고 있습니다. 내부적으로 재 연결을 해준다면 저런 코드를 제거할 수 있다는 생각이 들었습니다.
public Future<Void> begin(ConnectionTag connectionTag) {
cancelEvent = new CountDownLatch(1);
future = executor.submit(() -> {
boolean connected;
do {
if (cancelEvent.await(100, TimeUnit.MILLISECONDS)) {
break;
}
connected = TcpClient.this.connectOnce(connectionTag);
} while (!connected);
cancelEvent.countDown();
return null;
});
return future;
}
결과는 엉뚱한 생각이었네요. 단지 3번 재시도를 수행하고 약 21초 뒤에 Connection Timeout 이 발생하고 실행 제어를 반환합니다. (테스트는 Windows 운영체제에서 수행했습니다.)