Java Netty (1)

Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的包裹,比NIO更加高档,效率更是有力。可以说发展的不二法门是IO->NIO->Netty。

ServerBootstrap和ClientBootstrap是Netty中六个相比根本的类,分别用来展开服务器和客户端的伊始化。

服务器:

        // ChannelFactory
        final ChannelFactory channelFactory = new NioServerSocketChannelFactory(  
                // Boss线程池,处理Socket请求
                Executors.newCachedThreadPool(),  
                // Worker线程池,由于使用的是NIO,1个Worker线程可以管理多个Channel
                Executors.newCachedThreadPool()); 
        // ServerBootstrap
        ServerBootstrap bootstrap = new ServerBootstrap(channelFactory);

        ServerPipelineFactory serverPipelineFactory = new ServerPipelineFactory(executionHandler);
        bootstrap.setPipelineFactory(serverPipelineFactory); 

ServerBootstrap实例化时需要一个ServerSocketChannelFactory参数,ServerSocketChannelFactory可以采用NioServerSocketChannelFactory或者OioServerSocketChannelFactory,NioServerSocketChannelFactory使用的是NIO,OioServerSocketChannelFactory使用的是见怪不怪IO。两者都急需五个线程池,一个Boss线程池,一个Worker线程池。一个Boss线程负责对一个端口的监听,接收到Socket连接请求未来交给一个Worker线程处理,然后自己连续监听。

Worker线程负责对接受到的连续请求举行拍卖,尽管是NIO,一个Worker线程可以处理五个Socket或者说Channel,假设是平凡IO,Worker线程和Socket或者说Channel是逐一对应的关联。

Channel有音信到达时,Worker线程就进展处理。处理的过程看似于Struts的Filter-chain。每个Channel都有一个ChannelPipeline,ChannelPipeline定义了无数有各样的Handler,按梯次对接到到的信息举行拍卖。

稍许Handler,比如大气的IO操作,或者大量的读写数据库,会促成对消息的处理时间过长,长时间占用Worker线程,这时就需要另一个线程池–Netty自带的ExecutionHandler。ExecutionHandler也是一个Handler,定义在ChannelPipeline里面,它会从友好的线程池里面拿出一个线程,处理写在祥和背后的Handler,从而得以尽快释放Worker线程。

ExecutionHandler的实例化:

static ExecutionHandler executionHandler = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576));

Excecutor有二种:MemoryAwareThreadPoolExecutor和OrderedMemoryAwareThreadPoolExecutor,前者保证不会冒出内存溢出荒唐,假设伊芙(Eve)nt太多就会杜绝,后者除了担保不会产出内存溢出荒谬以外,还保证同一个Channel的伊芙(Eve)nt遵照顺序处理。

相关文章