一种简单而通用的方法,用于处理所有 Netty 异步出站异常,而无需调用 sync() 或为每个操作添加侦听器



在Netty中,我们通常在ChannelChannelHandlerContext上调用方法来对连接执行操作。特别是诸如write()flush()writeAndFlush()之类的方法用于发送消息。但是,这些方法是异步的,如果连接或传递的参数中存在错误,它们可能会引发异常。除非我们调用sync()/get()同步等待结果,或使用addListener()/addListeners()添加侦听器,否则不会处理此类异常。

所以我的问题是:是否有一种通用方法可以异步处理所有此类异常而无需调用额外的方法,例如,通过在构建Bootstrap或初始化Channel期间添加整体异常处理程序?

我已经阅读并尝试了这个答案 https://stackoverflow.com/a/31073723/5082913,但发现在管道尾部添加ChannelDuplexHandler只能处理入站异常。

与其

自己编写侦听器代码,不如使用已经处理异常的预先存在的侦听器

只需在每次写入/刷新调用后调用.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE)

发送过程中引发的异常现在将引导到您的 exceptionCaught(Throwable ex) 函数,因此您可以在同一位置处理写入和读取异常。

> 对于.addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE)来说,更好的选择是将ctx.voidPromise()作为writewriteAndFlush的第二个参数传递。它将负责传播异常。另一个好处是不会创建未使用的ChannelFuture对象。

例:

ctx.write(msg, ctx.voidPromise());

最新更新