java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Netty Handler链调用

Netty的Handler链调用机制及如何组织详解

作者:WARRIOR30

这篇文章主要为大家介绍了Netty的Handler链调用机制及如何组织示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

什么是 Handler

Netty是一款基于NIO的异步事件驱动网络应用框架,其核心概念之一就是Handler。而Handler是Netty中处理事件的核心组件,用于处理入站和出站的数据流,实现业务逻辑和网络协议的处理。

在Netty中,Handler是一个接口,主要分为两种:ChannelInboundHandler(入站Handler)和ChannelOutBoundHandler(出站Handler),如下图所示。

Handler 是怎么被组织起来的

Handler 链调用机制

简述

ChannelPipeline的源码中,我们可以看到这样的一段注释

这可能容易让人产生认为Pipeline 中维护了两条链表,其中一条用于处理出站事件,另外一条处理入站事件。

实际上,Pipeline是维护了一条双向链表,当数据从入站方向流经处理程序链时,数据从双向链表的head 向后面遍历,依次将事件交由后面一个handler处理,当数据从出站方向流经处理程序链时,数据从双向链表的tail 向前面遍历,依次将事件交由下一个handler处理。

ChannelPipeline 如何调度 handler

上面提到,Pipeline 中维护了一个由handler双向链表。那么,当事件进入pipeline 中时,ChannelPipeline 是如何调用这些 handler 的呢 ?

事件第一个经过的一定是 head ,因此在下面的代码中,invokeChannelRead()传入的是 head

 @Override
 public final ChannelPipeline fireChannelRead(Object msg) {
     AbstractChannelHandlerContext.invokeChannelRead(head, msg);
     return this;
 }
 private void invokeChannelRead(Object msg) {
     if (invokeHandler()) {
         try {
             ((ChannelInboundHandler) handler()).channelRead(this, msg);
         } catch (Throwable t) {
             notifyHandlerException(t);
         }
     } else {
         fireChannelRead(msg);
     }
 }
 @Override
 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
     ctx.fireChannelRead(msg);
 }
 @Override 
 public ChannelHandlerContext fireChannelRead(final Object msg) {
     invokeChannelRead(findContextInbound(), msg);
     return this;
 }
 ​
 private AbstractChannelHandlerContext findContextInbound() {
     AbstractChannelHandlerContext ctx = this;
     do {
         ctx = ctx.next;
     } while (!ctx.inbound);
     return ctx;
 }

从这点可以看出:一般情况下,我们需要在处理程序链中的每个handler调用 ctx.fireChannelRead(msg),以确保将事件传递给下一个处理程序。如果在handler中未调用 ctx.fireChannelRead(msg),则该事件将被截获并停留在当前handler中,不会传递到下一个处理程序。

事件出站的调度从双向链表的tail开始,调用机制与入站类似,这里不再赘述。

以上就是Netty的Handler链调用机制及如何组织详解的详细内容,更多关于Netty Handler链调用的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文