`

MINA工作流程

    博客分类:
  • MINA
阅读更多

Mina 中的很多执行环节都使用了多线程机制,用于提高性能。Mina 中默认在三个地方使用了线程:


(1.) IoAcceptor:
这个地方用于接受客户端的连接建立,每监听一个端口(每调用一次bind()方法),都启用一个线程,这个数字我们不能改变。这个线程监听某个端口是否有请求到来,一旦发现,则创建一个IoSession 对象。因为这个动作很快,所以有一个线程就够了。

 

(2.) IoConnector:
这个地方用于与服务端建立连接,每连接一个服务端(每调用一次connect()方法),就启用一个线程,我们不能改变。同样的,这个线程监听是否有连接被建立,一旦发现,则创建一个IoSession 对象。因为这个动作很快,所以有一个线程就够了。

 

(3.) IoProcessor:
这个地方用于执行真正的IO 操作,默认启用的线程个数是CPU 的核数+1,譬如:单CPU 双核的电脑,默认的IoProcessor 线程会创建3 个。这也就是说一个IoAcceptor 或者IoConnector 默认会关联一个IoProcessor 池,这个池中有3 个IoProcessor。因为IO 操作耗费资源,所以这里使用IoProcessor 池来完成数据的读写操作,有助于提高性能。这也就是前面说的IoAccetor、IoConnector 使用一个Selector,而IoProcessor 使用自己单独的Selector 的原因。


那么为什么IoProcessor 池中的IoProcessor 数量只比CPU 的核数大1 呢?因为IO 读写操作是耗费CPU 的操作,而每一核CPU 同时只能运行一个线程,因此IoProcessor 池中的IoProcessor 的数量并不是越多越好。这个IoProcessor 的数量可以调整,如下所示:


IoAcceptor acceptor=new NioSocketAcceptor(5);
IoConnector connector=new NioSocketConnector(5);

 

这样就会将IoProcessor 池中的数量变为5 个,也就是说可以同时处理5 个读写操作。还记得前面说过Mina 的解码器要使用IoSession 保存状态变量,而不是Decoder 本身,这是因为Mina 不保证每次执行doDecode()方法的都是同一个IoProcessor 这句话吗?其实这个问题的根本原因是IoProcessor 是一个池,每次IoSession 进入空闲状态时(无读些数据发生),IoProcessor 都会被回收到池中,以便其他的IoSession 使用,所以当IoSession从空闲状态再次进入繁忙状态时,IoProcessor 会再次分配给其一个IoProcessor 实例,而此时已经不能保证还是上一次繁忙状态时的那个IoProcessor 了。你还会发现IoAcceptor 、IoConnector 还有一个构造方法, 你可以指定一个java.util.concurrent.Executor 类作为线程池对象,那么这个线程池对象是做什么用的呢?其实就是用于创建(1.)、(2.)中的用于监听是否有TCP 连接建立的那个线程,默认情况下,使用Executors.newCachedThreadPool()方法创建Executor 实例,也就是一个无界的线程池(具体内容请参看JAVA 的并发库)。大家不要试图改变这个Executor 的实例,也就是使用内置的即可,否则可能会造成一些莫名其妙的问题,譬如:性能在某个访问量级别时,突然下降。因为无界线程池是有多少个Socket 建立,就分配多少个线程,如果你改为Executors 的其他创建线程池的方法,创建了一个有界线程池,那么一些请求将无法得到及时响应,从而出现一些问题。

 


下面我们完整的综述一下Mina 的工作流程

(1.) 当 IoService 实例创建的时候,同时一个关联在IoService 上的IoProcessor 池、线程池也被创建;

 

(2.) 当 IoService 建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,IoService 从线程池中取出一个线程,监听套接字端口;

 

(3.) 当 IoService 监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor 实例执行这个会话通道上的过滤器、IoHandler;

 

(4.) 当这条IoSession 通道进入空闲状态或者关闭时,IoProcessor 被回收。

 

上面说的是Mina 默认的线程工作方式,那么我们这里要讲的是如何配置IoProcessor 的多线程工作方式。因为一个IoProcessor 负责执行一个会话上的所有过滤器、IoHandler,也就是对于IO 读写操作来说,是单线程工作方式(就是按照顺序逐个执行)。假如你想让某个事件方法(譬如:sessionIdle()、sessionOpened()等)在单独的线程中运行(也就是非IoProcessor 所在的线程),那么这里就需要用到一个ExecutorFilter 的过滤器。你可以看到IoProcessor 的构造方法中有一个参数是java.util.concurrent.Executor,也就是可以让IoProcessor 调用的过滤器、IoHandler 中的某些事件方法在线程池中分配的线程上独立运行,而不是运行在IoProcessor 所在的线程。

分享到:
评论
1 楼 longxiaoyan 2011-07-08  
总结得不错,看了几天关于mina的线程终于明白了。

相关推荐

    Mina 使用DEMO

    Mina 工作流程 1. **服务端启动**:创建一个Acceptor,配置监听的端口号,然后启动服务。 2. **客户端连接**:客户端通过Socket连接到服务端,服务端接收到连接请求后,会创建一个Session对象来表示该连接。 3. ...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...

    mina程序执行过程

    Mina 是一个高性能的网络通信框架,主要用于构建网络应用程序,如服务器端的TCP或UDP通信。在Mina程序执行过程中,主要涉及以下几个关键步骤和组件: 1. **Acceptor 的建立**: Mina 提供了 `NioSocketAcceptor` ...

    mina连接 mina心跳连接 mina断线重连

    Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...

    jbpm4.3 流程申请(mina通信)

    **jbpm4.3流程申请(mina通信)** jbpm4.3是Java Business Process Management (BPM)系统的第四次重大版本更新,它提供了一套完整的业务流程管理解决方案,包括流程设计、执行、监控和优化等功能。在这个例子中,我们...

    mina+spring实现多人聊天室程序

    《使用Mina+Spring构建多人聊天室程序》 在当今的互联网时代,实时通信系统已经成为了各类应用不可或缺的一部分。Mina框架和Spring框架的结合,为开发者提供了一种高效、灵活的方式来实现这样的系统,特别是多人...

    mina demo

    本篇文章将围绕MINA的基本概念、核心组件、工作流程以及实际应用进行深入探讨。 一、MINA 基本概念 1. NIO (Non-blocking I/O):MINA 是基于Java NIO(非阻塞I/O)实现的,NIO允许单个线程处理多个连接,提高了...

    mina客户端简单代码示例

    Apache Mina是一个开源的网络通信框架,主要用于简化Java应用程序与远程服务器之间的通信。它提供了高度可扩展和高性能...通过这个示例,你可以深入理解Mina客户端的基本工作流程,并以此为基础开发更复杂的网络应用。

    mina自定义编解码器详解

    - `MinaCodec`可能是一个包含编码器和解码器的类,我们来详细分析其工作流程: - 在编码器中,通常有一个或多个重载的encode()方法,根据不同的输入类型进行编码。例如,可以有一个`encode(MyObject obj, ...

    mina demo mina jar包

    Apache Mina是一个开源项目,它提供了一个高度可扩展的网络通信框架,用于简化开发高性能、高可用性的网络服务器和客户端应用程序。"Mina demo mina jar包"指的是使用Apache Mina框架创建的一个演示示例,这个示例...

    mina

    "工具"则表明MINA是一个用于开发的工具,可以帮助程序员简化网络编程的工作。 压缩包中的文件名揭示了一些关于MINA的特定主题: 1. **基于MINA框架快速开发网络应用程序(转载).html**:这可能是一个教程或指南,教...

    apache mina-spring 服务端程序

    Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高并发的网络应用程序,如服务器端应用。它提供了一种简单而强大的编程模型,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。Spring...

    mina.zip内涵所有mina所需jar包

    Apache Mina是一个高度可扩展的Java网络通信框架,它提供了简单而强大的开发接口,用于创建高性能、高效率的网络应用程序。Mina的核心理念是将网络协议处理与业务逻辑分离,使得开发者可以专注于实现应用程序的业务...

    Mina 服务端客户端示例程序

    3. **过滤器链**:Mina的过滤器(Filter)机制允许开发者插入自定义的逻辑在数据读写流程中,如数据编码解码、安全加密等。过滤器链可以灵活组合,提高代码复用性和模块化。 4. **服务端构建**:在服务端示例中,...

    mina2学习笔记

    - 揭示了Mina框架内部的工作原理,包括事件循环机制、线程模型等,帮助开发者更好地理解和使用Mina。 ##### 3.4 Mina的线程模型配置 - 解释了Mina中线程模型的配置方法,包括如何合理分配线程资源以达到最佳性能。...

    Mina2中文文档

    - **服务端架构**:详细介绍了Mina服务端的主要组件和服务流程。 - **客户端架构**:分析了Mina客户端的设计原理和实现方法。 - **示例代码**:提供了TCP Server、TCP Client、UDP Server及UDP Client等典型应用场景...

    mina2 实例程序(socket通讯调用远程方法)

    《mina2实现Socket通信调用远程方法详解》 在当今的分布式系统中,远程方法调用(Remote Method ...提供的"mina2-remotMethod"实例程序是一个很好的学习起点,可以帮助我们深入理解Mina2在实际应用中的工作方式。

    apache-mina源码

    MINA提供了异步的、事件驱动的网络应用编程接口(API),适用于TCP和UDP协议,简化了网络编程的工作。在这个"apache-mina源码"中,我们可以深入理解MINA的设计原理和实现细节。 MINA的核心概念包括: 1. **...

    给予mina 协议进行大数据传输

    3. **异步通信**:MINA的异步通信模式意味着发送请求后无需等待响应,而是继续处理其他任务,当响应到来时,MINA会通过回调函数通知应用程序。 4. **多协议支持**:MINA不绑定于特定的网络协议,开发者可以轻松创建...

Global site tag (gtag.js) - Google Analytics