我们知道netty的handler有一个exceptionCaught事件处理器,而目前exceptionCaught是ChannelHandler接口的方法。

其中还有一个可以解决的是promise,promise是一个通道,异步的调用,当你发送成功,也就是走到netty最上面的处理器的时候,会通知trysetsuccess() , 这个也需要注意一下,promise不允许我们去设置,只允许系统设置,不然会有warning日志。
因此如何解决就是,通过设置一个lock锁,阻塞到接受到通知,当出站处理的时候出现异常,会通知所有的eventlistener。
因此可以一下这么设计。 因此这就是我要讲的。其实我设计的也不合理。情况太少,只有成功和异常,才会去解锁,是否远程调用。
Object lock=new Object();
channel.writeAndFlush(rpcRequest).addListener(future -> {
if (future.isSuccess()){
synchronized (lock){
lock.notify();
}
}
if (future.cause() != null) {
synchronized (lock){
lock.notify();
}
throw new RpcException(future.cause());
}
});
lock.wait();
return new RpcFuture(rpcRequest).get(1000).getResult();