跳至主要內容

ChannelHandler


ChannelHandler

ChannelHandler可专门用于几乎任何类型的动作。

ChannelHandler是专为支持广泛的用途而设计的,可以将它看作是处理往来ChannelPipeline事件(包括数据)的任何代码的通用容器。

ChannelHandler的生命周期

ChannelHandler接口定义的生命周期操作如下表所示,在ChannelHandler被添加到ChannelPipeline中或者被从ChannelPipeline中移除时会调用这些操作。这些方法中的每一个都接受一个ChannelHandlerContext参数。

类型描述
handlerAdded当把ChannelHandler添加到ChannelPipeline中时被调用
handlerRemoved当从ChannelPipeline中移除ChannelHandler时被调用
exceptionCaught当处理过程中在ChannelPipeline中有错误产生时被调用

Netty中定义了两个重要的ChannelHandler子接口:

  • ChannelInboundHandler:处理入站数据以及各种状态变化;
  • ChannelOutboundHandler:处理出站数据并且允许拦截所有的操作。

ChannelHandler的执行和阻塞

通常ChannelPipeline中的每一个ChannelHandler都是通过它的EventLoop来处理传递给它的事件的。所以至关重要的是不要阻塞这个线程,因为这会对整体的IO处理产生负面的影响。

但有时可能需要与那些使用阻塞API的遗留代码进行交互。对于这种情况,ChannelPipeline有一些接受一个EventExecutorGroup的add()方法。如果一个事件被传递给一个自定义的EventExecutorGroup,它将被包含在这个EventExecutorGroup中的某个EventExecutor所处理,从而被从该Channel本身的EventLoop中移除。对于这种用例,Netty提供了一个叫DefaultEventExecutorGroup的默认实现。

上次编辑于:
贡献者: Neil