org.jboss.netty.channel.socket.oio
类 OioServerSocketChannelFactory

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

public class OioServerSocketChannelFactory
extends java.lang.Object
implements ServerSocketChannelFactory

一个创建基于ServerSocketChannel的服务端阻塞I/O的ServerSocketChannelFactory .它利用好的旧的阻塞I/O API,众所周知当它服务人数较少的连接时能产生更好的吞吐量和延迟.

线程工作原理

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

Boss线程

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

Worker线程

就像传统的阻塞I/O线程模型一样,每个连接的Channel都有一个专用的worker线程.

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

所有线程会从在创建一个OioServerSocketChannelFactory时指定的Executor 获得.boss线程从bossExecutor获得,worker线程从workerExecutor 里获得.因此,你必须确定指定的Executor可以被足够多的线程使用.

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

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

限制

通过该工厂创建的ServerSocketChannel和它的子Channle都不支持异步操作.任何I/O请求如"write" 都会以阻塞方式执行.


构造方法摘要
OioServerSocketChannelFactory(java.util.concurrent.Executor bossExecutor, java.util.concurrent.Executor workerExecutor)
          创建一个实例.
 
方法摘要
 ServerSocketChannel newChannel(ChannelPipeline pipeline)
          创建和打开一个新的Channel,并使用指定的 ChannelPipeline附加到新的 Channel.
 void releaseExternalResources()
          释放该工厂依赖的外部资源.
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

OioServerSocketChannelFactory

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

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

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