public void callMethod(final MethodDescriptor method, final RpcController controller, final Message param, final Message responseType, RpcCallback<Message> done) { int nextSeqId = sequence.getAndIncrement(); Message rpcRequest = buildRequest(nextSeqId, method, param); inboundHandler.registerCallback(nextSeqId, new ResponseCallback(controller, responseType, done)); ChannelPromise channelPromise = getChannel().newPromise(); channelPromise.addListener(new GenericFutureListener<ChannelFuture>() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (!future.isSuccess()) { inboundHandler.exceptionCaught(null, new ServiceException(future.cause())); } } }); getChannel().writeAndFlush(rpcRequest, channelPromise); }