最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Netty 中的例外

网站源码admin1浏览0评论

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();
}

在上面的代码片段中,我们记录了异常消息,并调用了 ChannelHandlerContextclose()。

这将关闭服务器和客户端之间的通道。实质上导致客户端断开连接并终止。

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

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论