Netty的exceptionCaught问题

2,013 阅读1分钟

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

根据这个图来讲,细心的人会发现exceptionCaught是属于InboundHandler的, 而不属于OutBoundHandler,因此会出现一个问题就是它那抓取哪部分异常。 一次异常的问题:我们的解码器无法抓去异常,这个就是为啥要说这个了,出站处理器是从下往上走,pipeline中下到上,然后我们会发现,最上面一层设置抓去也无法抓去,最终是无法处理,只能记录error日志。

其中还有一个可以解决的是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();