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的默认实现。