在Netty中,我们通常在Channel
或ChannelHandlerContext
上调用方法来对连接执行操作。特别是诸如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()
作为write
或writeAndFlush
的第二个参数传递。它将负责传播异常。另一个好处是不会创建未使用的ChannelFuture对象。
例:
ctx.write(msg, ctx.voidPromise());