저는 로그인에 대해서는 동기화 로직으로 처리했습니다.
1) 핸들러에서 아래처럼 queue를 만들고
final BlockingQueue<GenericRxMessage> rxQueue = new ArrayBlockingQueue<GenericRxMessage>(1);
2) channelRead 에서 queue에 offer하고
GenericRxMessage genericRx = new GenericRxMessage(packet_id, ...);
boolean offer = rxQueue.offer(genericRx, RXQUE_PUT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
3) 실제 요청하는쪽에서는
String strResponse = ch.writeAndFlush(request) ;
다음에
GenericRxMessage rx = null;
long remainTimeout = DEFAULT_RECEIVE_TIMEOUT_SECONDS; // 30초 업무에 맞게 ...
do {
rx = rxQueue.poll(1, TimeUnit.SECONDS);
ensureChannelActive(); // timeout 경과되기 전에라도 채널 종료되면 InterruptException 발생시켜 빠져나가기 위함
} while (rx == null && --remainTimeout > 0);