org.jboss.netty.channel.socket.nio
类 NioServerSocketChannelFactory

java.lang.Object
  继承者 org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory
所有已实现的接口:
ChannelFactory, ServerChannelFactory, ServerSocketChannelFactory, ExternalResourceReleasable

public class NioServerSocketChannelFactory
extends java.lang.Object
implements ServerSocketChannelFactory

用于创建基于NIO的服务端ServerSocketChannelServerSocketChannelFactory .它利用引入了NIO非阻塞I/O模式有效率的服务大数量的并发连接.

线程工作原理

NioServerSocketChannelFactory里有两种类型的线程;boss线程和worker线程.

Boss线程

每个已绑定的ServerSocketChannel 都有自己的boss线程.例如,如果你打开两个服务端口如80和443,你会有两个boss线程 .一个boss线程可以接受传入连接直到端口取消绑定.一旦连接成功接受,boss线程就会把接收的Channel传输给由 NioServerSocketChannelFactory管理的worker线程中的一个.

Worker线程

一个NioServerSocketChannelFactory 会有一个或多个worker线程.一个worker线程会以非阻塞模式为一个或多个Channel执行非阻塞的读写操作.

线程的生命周期和正常关机

所有线程会从在创建一个NioServerSocketChannelFactory时指定的Executor 获得.boss线程从bossExecutor获得,worker线程从workerExecutor 里获得.因此,你必须确保指定的Executor可以被足够多的线程使用.最好的做法是指定一个 缓存线程池.

boss线程和worker线程都是延迟获取的,然后当没有任何东西需要处理时释放.当worker线程和boss线程被释放,所有关联的资源如 Selector也被释放.因此, 要正常的关闭一个服务, 你应该做到以下几点:

  1. 取消绑定由工厂创建的所有Channel
  2. 关闭由取消绑定Channel接收的所有子Channel,(到目前为止这两个步骤通常使用ChannelGroup.close() 来完成)
  3. 调用releaseExternalResources().
请确保关闭执行器之前所有Channel已经关闭.否则,你会获得一个RejectedExecutionException 并且相应的资源可能没有适当的释放.


构造方法摘要
NioServerSocketChannelFactory(java.util.concurrent.Executor bossExecutor, java.util.concurrent.Executor workerExecutor)
          创建一个实例.调用该构造方法和指定两倍可用处理器的 NioServerSocketChannelFactory(Executor, Executor, int)一样.可以通过 Runtime.availableProcessors()获取可用处理器的数量.
NioServerSocketChannelFactory(java.util.concurrent.Executor bossExecutor, java.util.concurrent.Executor workerExecutor, int workerCount)
          创建一个实例.
 
方法摘要
 ServerSocketChannel newChannel(ChannelPipeline pipeline)
          创建和打开一个新的Channel,并使用指定的 ChannelPipeline附加到新的 Channel.
 void releaseExternalResources()
          释放该工厂依赖的外部资源.
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

NioServerSocketChannelFactory

public NioServerSocketChannelFactory(java.util.concurrent.Executor bossExecutor,
                                     java.util.concurrent.Executor workerExecutor)
创建一个实例.调用该构造方法和指定两倍可用处理器的 NioServerSocketChannelFactory(Executor, Executor, int)一样.可以通过 Runtime.availableProcessors()获取可用处理器的数量.

参数:
bossExecutor - 执行I/O boss线程的Executor
workerExecutor - 执行I/O worker线程的Executor

NioServerSocketChannelFactory

public NioServerSocketChannelFactory(java.util.concurrent.Executor bossExecutor,
                                     java.util.concurrent.Executor workerExecutor,
                                     int workerCount)
创建一个实例.

参数:
bossExecutor - 执行I/O boss线程的Executor
workerExecutor - 执行I/O worker线程的Executor
workerCount - I/O worker线程的最大数
方法详细信息

newChannel

public ServerSocketChannel newChannel(ChannelPipeline pipeline)
从接口 ChannelFactory 复制的描述
创建和打开一个新的Channel,并使用指定的 ChannelPipeline附加到新的 Channel.

指定者:
接口 ChannelFactory 中的 newChannel
指定者:
接口 ServerChannelFactory 中的 newChannel
指定者:
接口 ServerSocketChannelFactory 中的 newChannel
参数:
pipeline - 准备附加到新ChannelChannelPipeline
返回:
返回新的通道

releaseExternalResources

public void releaseExternalResources()
从接口 ChannelFactory 复制的描述
释放该工厂依赖的外部资源. 外部资源是指不是由该工厂创建的资源. 例如, 在工厂指定的Executor就是外部资源. 当这些资源不被该工厂使用或不是应用程序的一部分时 ,你可以很方便的调用该方法去释放所有外部资源.然而如果一个由该工厂管理的打开通道资源被释放时会导致意料.

指定者:
接口 ChannelFactory 中的 releaseExternalResources
指定者:
接口 ExternalResourceReleasable 中的 releaseExternalResources