elasticsearch 1.7.5 中 的maven依赖 io.netty netty 3.10.5.Final
NettyTransport.java
首先使用 ServerSocketChannelFactory 来建立 ServerBootstrap 实例, 而后设置
piplineFactory.ServerSocketChannelFactory 包括两种,oio/nio两种实现.
对于ServerSocketChannelFactory须要两种线程池,boss和worker.boss负责监听端口,
每个端口都有专门的线程复制处理,当一个请求来临时,boss线程会打开socket,封
装成channel,而后将channel交给worker来完成,而后boss线程继续监听.
worker 线程则是因为oio/nio 的两种实现来决定.
对于oio方式,channel被交由worker后,以后直到socket都关闭的过程当中都有这个worker
线程处理.
而对于nio方式,每个worker能够处理不一样的channel.可使用少许的worker线程处
理大量channel. worker线程在处理channel时,交给channelPipline来处理.在channelPipline中
能够有不少channelHandler.通常状况下Pipline中的handler是由相关worker线程
来完成,所以为了节约worker线程处理时间,一般另外建立线程和使用额外的线程池来
完成逻辑的处理.
netty3和4仍是有些差异的.
参考:
http://blog.163.com/wm_at163/blog/static/132173490201271154751439/
http://ifeve.com/channel-pipeline/java
NettyTransport.java 关键代码
// 建立ServerBootstrap方法
serverBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(bossFactory),Executors.newCachedThreadPool(workerFactory),workerCount));
// 加载pipline
serverBootstrap.setPipelineFactory(configureServerChannelPipelineFactory(name, settings));
ServerChannelPipelineFactory 做为setPipelineFactory的参数. ServerChannelPipelineFactory 实现 org.jboss.netty.channel.ChannelPipelineFactory接口.
在生成getPipline方法中socket
ChannelPipeline channelPipeline = Channels.pipeline();
channelPipeline.addLast("openChannels", nettyTransport.serverOpenChannels);
SizeHeaderFrameDecoder sizeHeader = new SizeHeaderFrameDecoder();
if (nettyTransport.maxCumulationBufferCapacity != null) {
if (nettyTransport.maxCumulationBufferCapacity.bytes() > Integer.MAX_VALUE) {
sizeHeader.setMaxCumulationBufferCapacity(Integer.MAX_VALUE);
} else {
sizeHeader.setMaxCumulationBufferCapacity((int) nettyTransport.maxCumulationBufferCapacity.bytes());
}
}
if (nettyTransport.maxCompositeBufferComponents != -1) {
sizeHeader.setMaxCumulationBufferComponents(nettyTransport.maxCompositeBufferComponents);
}
channelPipeline.addLast("size", sizeHeader);
channelPipeline.addLast("dispatcher", new MessageChannelHandler(nettyTransport, nettyTransport.logger, name));
return channelPipeline;elasticsearch
这就表示:任何请求符合条件的都会通过pipline来处理.会交给MessageChannelHandler来完成处理.
最后bind开始提供服务.maven