Netty | TCP Connection Timeout 값에 Integer.MAX_VALUE 를 사용하면 무한히 재연결 시도하나요?

주싱·2022년 4월 16일
0

Netty

목록 보기
8/9
post-custom-banner

궁금증

문득 아래와 같은 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 운영체제에서 수행했습니다.)

profile
소프트웨어 엔지니어, 일상
post-custom-banner

0개의 댓글