好像在前面的文章中,把netty定义的channel基本上都还算分析了一下吧。。但是channel部分空缺了一个比较重要的东西没有分析,那就是pipeline,所有的操作都是通过pipeline来进行的。。。
还是按照惯例,先来看看ChannelPipeline的继承体系:
这里看到的是三个最顶层的接口,ChannelPipeline同时继承了ChannelInboundInvoker和ChannelOutboundInvoker,
首先我们先来看看ChannelInboundInvoker吧,看这个接口的名字其实基本上就能知道它是干嘛的了,顾名思义就是当channel有数据进来的时候需要用它来处理。。。
//当channel的一些状态发生变化的时候,会调用里面的一些对应的方法
interface ChannelInboundInvoker {
/**
* A {@link Channel} was registered to its {@link EventLoop}.
*
* This will result in having the {@link ChannelStateHandler#channelRegistered(ChannelHandlerContext)} method
* called of the next {@link ChannelStateHandler} contained in the {@link ChannelPipeline} of the
* {@link Channel}.
*/
//当当前的channel注册到eventloop后会调用,最终会调用链表的第一个ChannelStateHandler的channelRegistered函数
ChannelInboundInvoker fireChannelRegistered();
/**
* A {@link Channel} was unregistered from its {@link EventLoop}.
*
* This will result in having the {@link ChannelStateHandler#channelUnregistered(ChannelHandlerContext)} method
* called of the next {@link ChannelStateHandler} contained in the {@link ChannelPipeline} of the
* {@link Channel}.
*/
//当所属的channel unregister的时候调用
ChannelInboundInvoker fireChannelUnregistered();
/**
* A {@link Channel} is active now, which means it is connected.
*
* This will result in having the {@link ChannelStateHandler#channelActive(ChannelHandlerContext)} method
* called of the next {@link ChannelStateHandler} contained in the {@link ChannelPipeline} of the
* {@link Channel}.
*/
ChannelInboundInvoker fireChannelActive();
/**
* A {@link Channel} is inactive now, which means it is closed.
*
* This will result in having the {@link ChannelStateHandler#channelInactive(ChannelHandlerContext)} method
* called of the next {@link ChannelStateHandler} contained in the {@link ChannelPipeline} of the
* {@link Channel}.
*/
ChannelInboundInvoker fireChannelInactive();
/**
* A {@link Channel} received an {@link Throwable} in one of its inbound operations.
*
* This will result in having the {@link ChannelStateHandler#exceptionCaught(ChannelHandlerContext, Throwable)}
* method called of the next {@link ChannelStateHandler} contained in the {@link ChannelPipeline} of the
* {@link Channel}.
*/
ChannelInboundInvoker fireExceptionCaught(Throwable cause);
/**
* A {@link Channel} received an user defined event.
*
* This will result in having the {@link ChannelStateHandler#userEventTriggered(ChannelHandlerContext, Object)}
* method called of the next {@link ChannelStateHandler} contained in the {@link ChannelPipeline} of the
* {@link Channel}.
*/
ChannelInboundInvoker fireUserEventTriggered(Object event);
/**
* A {@link Channel} received bytes which are now ready to read from its inbound buffer.
*
* This will result in having the {@link ChannelStateHandler#inboundBufferUpdated(ChannelHandlerContext)}
* method called of the next {@link ChannelStateHandler} contained in the {@link ChannelPipeline} of the
* {@link Channel}.
*/
//已经有数据到了buffer里面可以读取了,最终会调用inboundBufferUpdated方法,用于处理数据
ChannelInboundInvoker fireInboundBufferUpdated();
/**
* Triggers an {@link ChannelStateHandler#channelReadSuspended(ChannelHandlerContext) channelReadSuspended}
* event to the next {@link ChannelStateHandler} in the {@link ChannelPipeline}.
*/
ChannelInboundInvoker fireChannelReadSuspended();
}
定义还是很简单,无非都是当channel的状态发生改变的时候,调用channel的stathandler相应的方法。。。这里有一个比较重要的方法:
//已经有数据到了buffer里面可以读取了,最终会调用inboundBufferUpdated方法,用于处理数据
ChannelInboundInvoker fireInboundBufferUpdated();
它是在当已经有数据读取了,并保存到了buffer之后会调用的方法,用于找到整个handler链的第一个inboundhandler同时也是stathandler的inbountBufferUpdated方法来处理这些数据
接下来来看ChannelOutboundInvoker,顾名思义就是用来处理一些出口数据的,其实也就是一些数据的发送,当然还有connect之类的,这里就不列它的代码了,主要是有一些connect,write,sendfile等方法,其实最终这些都是调用pipeline上的operationhandler来进行具体的操作的。。。。
最后我们来看ChannelPipeline接口的定义,首先它既是inboundinvoker也是outboundinvoker,同时它最终又是一个channelhandler的管理器,在其中的定义的方法主要是对这些handler进行维护的方法,例如:
//将handler放到最靠前的位置
ChannelPipeline addFirst(String name, ChannelHandler handler);
/**
* Inserts a {@link ChannelHandler} at the first position of this pipeline.
*
* @param group the {@link EventExecutorGroup} which will be used to execute the {@link ChannelHandler}
* methods
* @param name the name of the handler to insert first
* @param handler the handler to insert first
*
* @throws IllegalArgumentException
* if there's an entry with the same name already in the pipeline
* @throws NullPointerException
* if the specified name or handler is {@code null}
*/
//多了一个executor,这里表示handler由这个executor执行
ChannelPipeline addFirst(EventExecutorGroup group, String name, ChannelHandler handler);
(1)inboundhandler,同时也是stathandler,他们主要是在channel的状态发生改变的时候用的,例如当有数据已经读取了,那么会调用相应的方法来处理数据
(2)outboundhandler,同时也是operationhandler,这些handler则是用于具体的数据发送等操作,例如connect,write等。。。。
好了,对pipeline的简单的分析就差不多了。。。可以给它下一个定义:它是数据出入口的处理器,同时还要管理用户定义的handler。。。。