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

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

public class NioClientSocketChannelFactory
extends java.lang.Object
implements ClientSocketChannelFactory

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

线程工作原理

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

Boss线程

一个NioClientSocketChannelFactory 有一个boss线程.当请求时会尝试一个连接.一旦连接尝试成功,boss线程就会把接收的Channel传输给由 NioClientSocketChannelFactory管理的worker线程中的一个.

Worker线程

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

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

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

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

  1. 关闭所有由工厂创建的Channel
  2. 调用releaseExternalResources().
请确保关闭执行器之前所有Channel已经关闭.否则,你会获得一个RejectedExecutionException 并且相应的资源可能没有适当的释放.


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

构造方法详细信息

NioClientSocketChannelFactory

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

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

NioClientSocketChannelFactory

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

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

newChannel

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

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

releaseExternalResources

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

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