ChannelHandlerContext
ChannelHandlerContext
ChannelHandlerContext代表了ChannelHandler和ChannelPipeline之间的关联。每当有ChannelHandler添加到ChannelPipeline中时,都会创建ChannelHandlerContext。ChannelHandlerContext的主要功能是管理它所关联的ChannelHandler和在同一个ChannelPipeline中的其他ChannelHandler之间的交互。
ChannelHandlerContext使得ChannelHandler能够和它的ChannelPipeline以及其他的ChannelHandler交互。ChannelHandler可以通知其所属的ChannelPipeline中的下一个ChannelHandler,甚至可以动态修改它所属的ChannelPipeline。
当ChannelHandler被添加到ChannelPipeline时,它将会被分配一个ChannelHandlerContext,其代表了ChannelHandler和ChannelPipeline之间的绑定。虽然这个对象可以被用于获取底层的Channel,但是它主要还是被用于写出站数据。
在Netty中,有两种发送消息的方式。你可以直接写到Channel中,也可以写到和ChannelHandler相关联的ChannelHandlerContext对象中。前一种方式将会导致消息从ChannelPipeline的尾端开始流动,而后者将导致消息从ChannelPipeline中的下一个ChannelHandler开始流动。
ChannelHandlerContext有很多的方法,其中一些方法也存在于Channel和ChannelPipeline本身上,但是有一点重要的不同。如果调用Channel或者ChannelPipeline上的这些方法,它们将沿着整个ChannelPipeline进行传播。而调用位于ChannelHandlerContext上的相同方法,则将从当前所关联的ChannelHandler开始,并且只会传播给位于该ChannelPipeline中的下一个能够处理该事件的ChannelHandler。
API
| 方法名称 | 描述 |
|---|---|
| alloc | 返回和这个实例相关联的Channel所配置的ByteBufAllocator |
| bind | 绑定到给定的SocketAddress,并返回ChannelFuture |
| channel | 返回绑定到这个实例的Channel |
| close | 关闭Channel,并返回ChannelFuture |
| connect | 连接给定的SocketAddress,并返回ChannelFuture |
| deregister | 从之前分配的EventExecutor注销,并返回ChannelFuture |
| disconnect | 从远程节点断开,并返回ChannelFuture |
| executor | 返回调度事件的EventExecutor |
| fireChannelActive | 触发下一个ChannelInboundHandler上的channelActive()方法(已连接)的调用 |
| fireChannelInactive | 触发下一个ChannelInboundHandler上的channelInactive()方法(已关闭)的调用 |
| fireChannelRead | 触发下一个ChannelInboundHandler上的channelRead()方法(已接收的消息)的调用 |
| fireChannelReadComplete | 触发下一个ChannelInboundHandler上的 |
| fireChannelRegistered | 触发下一个ChannelInboundHandler上的 |
| fireChannelUnregistered | 触发下一个ChannelInboundHandler上的 |
| fireChannelWritabilityChanged | 触发下一个ChannelInboundHandler上的 |
| fireExceptionCaught | 触发下一个ChannelInboundHandler上的 |
| fireUserEventTriggered | 触发下一个ChannelInboundHandler上的 |
| handler | 返回绑定到这个实例的ChannelHandler |
| isRemoved | 如果所关联的ChannelHandler已经被从ChannelPipeline中移除则返回true |
| name | 返回这个实例的唯一名称 |
| pipeline | 返回这个实例所关联的ChannelPipeline |
| read | 将数据从Channel读取到第一个入站换中去:如果读取成功则触发一个channelRead事件,并(在最后一个消息被读取完成后)通知ChannelInboundHandler的channelReadComplete(ChannelHandlerContext)方法)) |
| write | 通过这个实例写入消息并经过ChannelPipeline |
| writeAndFlush | 通过这个实例写入并冲刷消息并经过ChannelPipeline |
当使用ChannelHandlerContext的API时候,请牢记以下两点:
- ChannelHandlerContext和ChannelHandler之间的关联(绑定)是永远不会改变的,所以缓存对它的引用是安全的;
- 相对于其他类的同名方法,ChannelHandlerContext的方法将产生更短的事件流,应该尽可能地利用这个特性来获得最大的性能。
