channel.eventLoop().scheduleAtFixedRate() ---> channel.close() 시 스케줄한 태스크 종료 문의.

167 views
Skip to first unread message

Joo Sing

unread,
Mar 10, 2021, 11:46:32 PM3/10/21
to Netty Korean User Group
안녕하세요. Netty로 TCP 서버역할을 하는 장비 제어 프로그램을 개발중입니다. 

장비로 1초 주기로 상태 요청 메시지를 전송해야 하는 요구사항이 있어 channel.eventLoop().scheduleAtFixedRate() 메쏘드를 통해 반복 작업을 수행하도록 스케줄하였고, 정상 동작하고 있습니다. 아래와 같은 대략의 코드이구요. 

channel.eventLoop().scheduleAtFixedRate( () -> {
         channel .writeAndFlush("REQ MSG"); // -------------------------- 문제 코드 
         System.out.println(" REQ MSG"); 
}, 1000, 1000, TimeUnit.MILLISECONDS);

그리고 channel.close()를 호출해주면 위에 스케줄한 반복 태스크가 자동으로 실행을 중료해주는 것으로 확인이 되는데요. 

그런데 문제는 아래와 같이 channel.writeAndFlush() 코드를 제거해 주면 channel.close()를 해도 스케줄한 태스크가 종료되지 않는 차이가 발생을 하네요. 

channel.eventLoop().scheduleAtFixedRate( () -> {
         // channel .writeAndFlush(" REQ MSG  "); 
         System.out.println(" REQ MSG"); 
}, 1000, 1000, TimeUnit.MILLISECONDS);

둘 간의 어떤 차이점이 있는지 혹시 답변해 주실 분이 있을까요? 혹시 제가 검색해 볼 수 있는 키워드 같은 것만 알려주셔도 좋을 것 같아요. 

감사합니다. 

Joo Sing

unread,
Mar 12, 2021, 6:43:47 AM3/12/21
to Netty Korean User Group
둘 간에 정확히 왜 저런 차이가 나는지 원인은 찾지 못했지만 처리한 내용 공유합니다. 

channel 종료 시 스케줄된 작업을 명시적으로 cancel 해주도록 하였습니다. 

Stack Overflow에 올린 동일한 질문에 Norman Maurer 이라는 분이 (Netty 오픈소스 프로젝트에 많은 기여를 하시는 분 같아서 신뢰하고...) 답을 해주셔서 아래와 같이 수정했고 문제 없이 사용하고 있습니다. 
( https://stackoverflow.com/questions/66576761/does-channel-close-actually-stop-scheduled-tasks-by-channel-eventloop-schedu )

private final CopyOnWriteArrayList<ScheduledFuture<?>> userTaskFutures = new CopyOnWriteArrayList<>();

....

public void scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit) {
        ScheduledFuture<?> future = channel.eventLoop().scheduleAtFixedRate(task, initialDelay, period, unit);
        userTaskFutures.add(future);
}

public void disconnect() {
          ... 
          if (!userTaskFutures.isEmpty()) {
                     userTaskFutures.forEach(future -> future.cancel(true));
                     userTaskFutures.clear();
          }
          .... 
}

2021년 3월 11일 목요일 오후 1시 46분 32초 UTC+9에 Joo Sing님이 작성:
Reply all
Reply to author
Forward
0 new messages