Netty 中的例外
简而言之,Netty 是一个用于构建高性能异步和事件驱动网络应用程序的框架。I/O 操作在其生命周期内使用回调方法进行处理。
有关该框架以及如何开始使用它的更多详细信息,请参阅我们上一篇文章。
2. 处理 Netty 中的异常
如前所述,Netty 是一个事件驱动的系统,具有针对特定事件的回调方法。例外情况也是此类事件。
处理从客户端接收的数据时或在 I/O 操作期间可能会发生异常。发生这种情况时,将触发专用的异常捕获事件。
2.1. 处理源站异常
异常捕获事件在触发时由 ChannelInboundHandler 或其适配器和子类的 exceptionsCaught() 方法处理。
请注意,该回调已在通道处理程序接口中弃用。它现在仅限于 ChannelInboudHandler 接口。
该方法接受可抛出对象和 ChannelHandlerContext 对象作为参数。Throwable 对象可用于打印堆栈跟踪或获取本地化的错误消息。
因此,让我们创建一个通道处理程序 ChannelHandlerA 并使用我们的实现覆盖其 exceptionCaught():
代码语言:javascript代码运行次数:0运行复制public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
logger.info(cause.getLocalizedMessage());
//do more exception handling
ctx.close();
}
在上面的代码片段中,我们记录了异常消息,并调用了 ChannelHandlerContext 的 close()。
这将关闭服务器和客户端之间的通道。实质上导致客户端断开连接并终止。
2.2. 传播异常
在上一节中,我们在其源通道中处理了异常。但是,我们实际上可以将异常传播到管道中的另一个通道处理程序。
我们将使用 ChannelHandlerContext 对象手动触发另一个异常捕获事件,而不是记录错误消息并调用 ctx.close()。
这将导致调用管道中下一个通道处理程序的 exceptionCaught()。
让我们修改 ChannelHandlerA 中的代码片段,通过调用 ctx.fireExceptionCaught() 来传播事件:
代码语言:javascript代码运行次数:0运行复制public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
logger.info("Exception Occurred in ChannelHandler A");
ctx.fireExceptionCaught(cause);
}
此外,让我们创建另一个通道处理程序 ChannelHandlerB 并用这个实现覆盖它的 exceptionCaught():
代码语言:javascript代码运行次数:0运行复制@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
logger.info("Exception Handled in ChannelHandler B");
logger.info(cause.getLocalizedMessage());
//do more exception handling
ctx.close();
}
在服务器类中,通道按以下顺序添加到管道中:
代码语言:javascript代码运行次数:0运行复制ch.pipeline().addLast(new ChannelHandlerA(), new ChannelHandlerB());
在所有异常都由一个指定的通道处理程序处理的情况下,手动传播异常捕获的事件非常有用。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-08-25,如有侵权请联系 cloudcommunity@tencent 删除netty对象事件异常java