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,前者保证不会出现内存溢出错误,如果Event太多就会堵塞,后者除了保证不会出现内存溢出错误以外,还保证同一个Channel的Event按照顺序处理。

原文地址:https://www.cnblogs.com/mstk/p/6790512.html