netty 응답 대기를 시키고 싶습니다.

164 views
Skip to first unread message

nene

unread,
Mar 24, 2021, 3:24:04 AM3/24/21
to Netty Korean User Group
안녕하세요. netty 초보 개발자입니다.

웹에서 네티를 통한 통신을 개발하고 있는데요.

serviceimpl에서 writeAndflush로 데이터를 보내고 다시 결과를 받는 과정을 진행하고 있습니다.

 handler에 있는 channelRead 함수가 진행되고 그 결과를 받을떄까지 serviceimpl의 흐름을 멈추고 싶은데요. 

channelRead 작업이 전부 완료 됨을 확인하는 방법이 없을까요 ? 
future.isDone() , await() , sync() , 
이것저것 다써봤는데 channelRead 작업이 끝나지도 않았음에도 결과를 내버리는 아이들이더라구요.  
Message has been deleted

zbum

unread,
Mar 26, 2021, 2:28:34 AM3/26/21
to Netty Korean User Group
netty handler 에서 블로킹을 하는 것은 어떤 경우이든 반대 입니다. 
handler 를 채널별로 생성하고 상태를 관리해서 처리하는 것을 조심스럽게 권해 봅니다.


2021년 3월 24일 수요일 오후 4시 58분 23초 UTC+9에 필그림님이 작성:
네티가 데이터 처리가 비동기로 처리가 되어 약간 복잡하기는 해도 
CompletableFuture  같은 객체로 처리하면  가능해 보입니다.

CompletableFuture 인스턴스 (이하  completableFuture)를  serviceimpl 과 handler 에 서로 공유하도록 구현해야 하겠지요.
그리고 받은 데이터가 전에 보낸 데이터에 대한 결과라는 걸 식별할 수 있어야 하구요 (보내는 쪽과 받는 쪽 모두 비동기로 처리가 되므로)
데이터를 받게 되면 해당  completableFuture  에 결과값을 설정하고
serviceimpl  에서  completableFuture.get() 에서 그 결과값을 받을 수 있지요. completableFuture 에 결과값을 설정하지 않으면 completableFuture.get()에서 멈추게 됩니다.

혹 어떤 문제가 발생해서 응답을 받지 못하면 completableFuture.get() 에서 영원히 멈추면 되지 않으므로  적당한 timeout 값을  설정해 주어야 겠지요.

처음에는 좀 헛갈려도 처리는 어렵지 않을 듯 싶네요..




2021년 3월 24일 (수) 오후 4:24, nene <yosik...@gmail.com>님이 작성:
--
이 메일은 Google 그룹스 'Netty Korean User Group' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/netty-ko/9d941661-a395-4683-b37e-8bc64ffab85cn%40googlegroups.com을(를) 방문하세요.

이재빈

unread,
Mar 26, 2021, 2:28:48 AM3/26/21
to Netty Korean User Group
handler에서 제공되는 channelReadComplete  를 사용하면 읽기가 완료되고 동작을 수행하게 할 수 있습니다.

channelRead는 데이터를 읽을 때 호출되고 channelReadComplete는 읽기 작업이 완료되면 호출됩니다.
serviceimpl의 흐름을 멈추지 않고도 channelReadComplete를 사용하면 완료 후 동작을 수행할 수 있을 것 같습니다.

2021년 3월 24일 수요일 오후 4시 24분 4초 UTC+9에 nene님이 작성:
Reply all
Reply to author
Forward
Message has been deleted
0 new messages