即时通讯开发之MINA2线程原理

Posted wecloud1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即时通讯开发之MINA2线程原理相关的知识,希望对你有一定的参考价值。

读入数据逻辑:

IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler)
写出数据逻辑:

业务逻辑处理(IoHandler)---日志记录、编码、threadPool(IoFilter)---IO写出(IoProcessor)
得出结论

由以上可以看出,IO读入和IO写出的过程是相反的。

 

MINA的线程基本原因

这里主要讨论一下Mina中的线程,使用线程,线程池可以提高性能,Mina中就使用了几种线程:

    IoAcceptor/IoConnector线程
    IoProcessor线程
    IoHandler线程

IoAcceptor/IoConnector 线程介绍

IoAcceptor用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务端建立连接,每连接一个服务端就建立一个线程。这两种线程都是通过线程池建立的,我们可以在构建对象的时候就指定线程池类型:

    
public NiosocketAcceptor(Executor executor, IoProcessor<NioSession> processor)     
public NioSocketConnector(Executor executor, IoProcessor<NioSession> processor)

此类线程池的构造在源代码中为(AbstractIoService第168行):

    
protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor)     
//省略部分代码    
        if (executor == null)     
            this.executor = Executors.newCachedThreadPool();    
            createdExecutor = true;    
        else     
            this.executor = executor;    
            createdExecutor = false;    
                   

由此可见默认的线程池类型为newCachedThreadPool,这是一个可根据需要创建新线程的线程池,在以前构造的线程可用时可以重用它们。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

 

IoProcessor 线程介绍

对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1,例如双核机器的IoProcessor的线程池大小默认为3,我们可以更改线程池的大小:
    
IoConnector connector = new NioSocketConnector(9);    
IoAcceptor acceptor = new NioSocketAcceptor(9);

如上就把IoProcessor线程池的大小改为9个。
IoProcessor线程池的默认大小在源代码中的定义(SimpleIoProcessorPool第82行):
    
private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;

IoProcessor线程池的构造在源代码中为(SimpleIoProcessorPool第144行):


public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType,  
            Executor executor, int size)  
        //省略部分代码  
        if (createdExecutor)  
            this.executor = Executors.newCachedThreadPool();  
        else  
            this.executor = executor;  
         

 IoHandler 线程介绍

当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理,过滤器的配置如下:
    
acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));

如上配置之后,IO处理和业务逻辑处理将会使用各自的线程池产生线程使用。如果你的应用每次处理请求的时间较长而又希望应用能够有较好的响应性,那么最好是把处理业务逻辑的任务放到一个新的线程中去执行,而不是在 mina 框架创建的线程中去执行。

线程是何时被创建的

    当 IoAcceptor/IoConnector实例创建的时候,同时一个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。
    当IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,从线程池中取出一个线程,监听套接字端口。
    当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor线程执行IO处理。
    如若过滤器中配置了“threadPool”过滤器,则使用此线程池建立线程执行业务逻辑(IoHandler)处理,否则使用IoProcessor线程处理业务逻辑。

以上是关于即时通讯开发之MINA2线程原理的主要内容,如果未能解决你的问题,请参考以下文章

企业即时通讯软件都有哪些?

即时通讯开发框架是选Netty还是Mina

即时通讯开发框架是选Netty还是Mina

开发即时通讯难不难?有没有第三方im?sdk可以推荐

分享即时通讯开发之Netty高性能原理

即时通讯开发之Netty的退出机制和原理