当前位置: 首页 > 后端技术 > Java

[Netty]五、ChannelPipeline和ChannelHandler

时间:2023-04-02 00:49:43 Java

一、介绍ChannelPipeline和ChannelHandler也是netty中的重要组件,他们的关系比较密切,所以这里介绍一下2.ChannelPipeline每一个新创建的Channel都会绑定一个管道ChannelPipeline,ChannelPipeline是由多个ChannelHandler(其实是ChannelHandlerContext,只不过是ChannelHandler外的一层)组成的双向链表。ChannelPipeline、Channel和ChannelHandler的关系如下:分为两类,入站处理器ChannelInboundHandler和出站处理器ChannelOutboundHandler。ChannelPipeline的工作流程后面会详细介绍,如下:ChannelPipeline在传播一个事件的时候,判断下一个ChannelHandler的类型是否和上面的事件运行方向匹配,比如如果是入站事件,则事件将首先流经入站处理程序2,然后流经入站处理程序4,并跳过出站处理程序。Conversely,ifitisanoutboundevent,itwillfirstflowthroughtheoutboundprocessor3,andthenthroughtheinboundoperationoftheoutboundprocessor1ChannelPipelinetonotifytheChannelInboundHandleroftheeventthatoccurredintheChannelPipeline,asfollows:fireChannelRegisteredcallsthechannelRegisteredmethodfireChannelUnregisteredofthenextChannelInboundHandler调用下一个ChannelInboundHandler的fireChannelUnregistered方法fireChannelActive调用下一个ChannelInboundHandler的fireChannelActive方法fireChannelInactive调用下一个ChannelInboundHandler的fireChannelInactive方法fireExceptionCaught调用下一个ChannelInboundHandler的fireExceptionCaught方法fireUserEventTriggered调用下一个ChannelInboundHandler的fireUserEventTriggered方法fireChannelRead调用下一个ChannelInboundHandler的fireChannelRead方法fireChannelReadComplete调用下ThefireChannelReadCompletemethodfireChannelWritabilityChangedofaChannelInboundHandlercallsthefireChannelWritabilityChangedmethodofthenextChannelInboundHandler.TheoutboundoperationoftheChannelPipelineisasfollows.TheconnectmethoddisconnectofaChannelOutboundHandlerwilldisconnecttheChannel,andwillcallthedisconnectmethodcloseofthenextChannelOutboundHandlertoclosetheChannel,andwillcallthenextChannelOutboundHandler的close方法deregister会将Channel从EventLoop中注销,调用下一个ChannelOutboundHandler的deregister方法flush刷新Channel中的缓存数据,调用下一个ChannelOutboundHandler的flush方法write写入message进入Channel,接下来会调用ChannelOutboundHandler的write方法writeAndFlush,是write()和flush()方法的组合。读请求从Channel中读取更多的数据,会调用下一个ChannelOutboundHandler的read方法。就是ChannelInboundHandler和ChannelOutboundHandlerChannelInboundHandler:处理入站数据和各种状态变化ChannelOutboundHandler:处理出站数据,允许拦截所有操作当接收到数据或者对应的Channel状态发生变化时,ChannelInboundHandler的生命周期方法会被调用,如下channelRegistered是当Channel注册到相应的EventLoop时调用channelUnregistered当Channel从其EventLoop中注销时调用channelActive当Channel处于活动状态时调用channelInactive当Channel离开活动状态时调用channelReadComplete当对Channel的读取操作是completeChannelRead在Channel读取数据时被调用。Channel的可写状态发生变化时调用channelWritabilityChanged。当调用ChannelInboundHandler.fireUserEventTriggered()方法时调用userEventTriggered。调用ChannelOutboundHandler处理出站操作和数据。当绑定到一个本地地址时,connect在请求将是Chan时被调用当通道连接到远程节点时调用断开连接。当请求断开Channel与远程节点的连接时,将调用disconnect。当发出关闭通道的请求时调用关闭。当请求从其EventLoop中注销Channel时,将调用deregister。当数据过多时调用Flush。当请求通过Channel将排队的数据刷新到远程节点时,当请求通过Channel将数据写入远程节点时,将调用write。4.总结每个Channel都绑定一个ChannelPipeline,ChannelPipeline由一系列的ChannelHandler连接起来。当入站事件进入时,事件会从头到尾流经ChannelPipeline的入站处理器ChannelInboundHandler,当触发出站事件时,事件会从头流到尾。它最终流经ChannelPipeline的出站处理程序ChannelOutboundHandler。

最新推荐
猜你喜欢