본문 바로가기

IT for developer/Netty

Netty 예제 분석 - Uptime

Uptime

http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/uptime/package-summary.html

Uptime 예제는 연결을 끊기면 재접속을 시도하는 클라이언트측 프로그램이다.

Discard와 Echo 클라이언트 프로그램과 다른 코드 부분을 살펴보면 다음과 같다.  

72
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
73              public ChannelPipeline getPipeline() throws Exception {
74 return Channels.pipeline(
75 new ReadTimeoutHandler(timer, READ_TIMEOUT),
76 new UptimeClientHandler(bootstrap, timer));
77 }
78 });

이전 예제와 다르게 파이프라인에 하나의 핸들러만 등록하지 않고 여러 개의 핸들러를 등록하고 있다. 처음으로 여러 핸들러를 등록한 예제라고 볼 수 있다. 우선 ReadTimeoutHandler가 무엇인지 살펴보자. 일정시간동안 read 하지 않으면 타임아웃 이벤트를 가지고 예외를 발생시킨다. 본 예제에서는 exceptionCaught 함수에서 접속을 종료한다. 접속종료가 완료되면 channelClosed 함수가 호출되고 이 함수내에 5초 마다 재연결을 시도하는 타이머를 지정한다.

60      @Override
61      public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) {
62          println("Sleeping for: " + UptimeClient.RECONNECT_DELAY + "s");
63          timer.newTimeout(new TimerTask() {
64              public void run(Timeout timeout) throws Exception {
65                  println("Reconnecting to: " + getRemoteAddress());
66                  bootstrap.connect();
67              }
68          }, UptimeClient.RECONNECT_DELAY, TimeUnit.SECONDS);
69      }

ReadTiemoutHandler와 UptimeClientHandler 모두 SimpleChannelUpstreamHandler를 상속받은 클래스로써 업스트림  즉, ReadTimeoutHandler --> UptimeClientHandler 순으로 이벤트가 전달된다.