`
duzc2
  • 浏览: 60770 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

服务端Mina线程关系和数据流动分析

阅读更多


一  线程关系

NioSocketAcceptor类

线程数量:1

         线程名格式:NioSocketAcceptor-1

创建Runnable类:AbstractPollingIoAcceptor. Acceptor

         用途:

         负责处理Selector选择器获得的新建连接,为信道包装IoSession、为IoSession指派唯一的NioProcessor线程、为IoSession设置初始Attributes、初始化IoSession域变量、将IoSession加入到NioProcessor的newSessions列队,最后激活NioProcessor类的处理线程。

         注意事项:创建NioSocketAcceptor对象时可以传递int参数作为NioProcessor的线程数量。NioSocketAcceptor用SimpleIoProcessorPool包装NioProcessor来控制线程数量。SimpleIoProcessorPool传递ThreadPoolExecutor给NioProcessor的构造方法,用于NioProcessor申请线程,并创建NioProcessor对象将Pool装满。



NioProcessor类

默认线程数量:cpu核心数+1

线程名格式NioProcessor-85

创建Runnable类:AbstractPollingIoProcessor.Processor

    用途:

1 将Selector选择到的可读状态的IoSession对应的SocketChannel读取缓冲区内容读取到一个新的IoBuffer中,并激活IoFilterChain. fireMessageReceived(buf)事件,将IoBuffer传递给过滤器链。

2 将Selector选择到可写状态的IoSession加入到flushingSessions列队,等待另外一个线程负责写入操作。

3 将NioSocketAcceptor类添加到newSessions列队中的IoSession注册到自己的Selector的OP_READ状态、建立IoSession上的过滤器链、调用IoServiceListenerSupport.fireSessionCreated(IoSession)以激活过滤器链的sessionCreated(IoSession)方法。

注意事项:

由于这里为每个IoSession指定了唯一的NioProcessor线程,所以单个IoSession上的读取数据解码、过滤器链的消息接受事件触发一定是在同一个线程中。也就是说一个多个IoSession被绑定在一个NioProcessor的线程上。分配策略为简单循环分配。



ExecutorFilter类(可选,可大幅提高性能)

默认线程数量:16

创建Runnable类:用指定线程工厂包装参数

    用途:

    在FilterChain最后,负责将事件从NioProcessor线程分发至业务线程,再触发事件,可避免业务逻辑占用IO线程。

    建议:

    为避免过长时间占用IO线程、避免IO线程参与业务逻辑,应将IoBuffer->Message的转换工作放在ExecutorFilter触发之后。

    注意事项:

IoHandler的sessionCreated(IoSession)应该尽量简短、保证尽快完成,因为NioSocketAcceptor是先将IoSession注册到Selector的OP_READ状态,由于业务线程和IO线程分开,很可能在sessionCreated链完成操作之前被其他线程触发接sessionOpened或messageReceived,导致数据未初始化完成。







二  数据流动分析(业务消息)

接收过程的三次线程切换

1 客户端->服务器底层缓冲区->等待Selector选中OP_READ。

2 NioProcessor线程处理可读状态IoSession并触发。IoFilterChain.fireMessageReceived(Object);ExecutorFilter调用OrderedThreadPoolExecutor.execute(Runnable)用IoFilterEvent包装消息,并加入IoSession.getAttribute(TASKS_QUEUE)列队,等其他线程处理TASKS_QUEUE列队。

3 业务逻辑线程读取TASKS_QUEUE列队并执行IoFilterEvent.fire()方法,继续执行后续Filter和IoHandler事件。


发送过程的三次线程切换

1 业务逻辑调用IoSession.write(Object)。IoSession将参数包装为DefaultWriteRequest,并触发IoFilterChain.fireFilterWrite(WriteRequest),org.apache.mina.core.filterchain.DefaultIoFilterChain.HeadFilter.filterWrite(NextFilter, IoSession, WriteRequest)方法将消息加入IoSession. writeRequestQueue列队,等待其他线程处理消息发送。

2 NioProcessor的Selector取出OP_WRITE状态的IoSession;再从中取出有消息要写入的IoSession,清除其OP_WRITE状态,如果IoSession.currentWriteRequest不存在,从IoSession. writeRequestQueue取出一条消息,设置为IoSession.currentWriteRequest准备发送;但由于缓冲区余量等原因,不保证每次调用都能发出消息,更不保证能清空IoSession. writeRequestQueue(输出缓冲区为输入缓冲区的1.5倍);根据结果设置IoSession的OP_WTIRE。

3 服务器底层缓冲区->客户端

分享到:
评论
2 楼 duzc2 2012-09-15  
chgyan 写道
 

guangyan ?
1 楼 chgyan 2012-09-15  
 

相关推荐

    MINA 服务端和客户端demo

    在"MINA 服务端和客户端demo"中,我们有两个主要的部分:服务端(Server)和客户端(Client)。这两个部分都是基于MINA框架构建的,分别实现了服务器接收客户端连接、处理数据和客户端发起连接、发送数据的功能。 1...

    服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)

    6. **Echo服务器**:Echo服务器是一种简单的服务器,它接收到什么数据就返回什么数据,常用于测试网络连接和数据传输。 综上,这个示例代码应该包含了如何使用MINA2构建一个基于UDP的Echo服务器,以及如何在MINA2...

    Mina 服务端客户端示例程序

    6. **会话管理**:Mina中的IoSession对象代表了服务端和客户端之间的连接会话,提供了管理连接状态、传输数据和配置会话属性的能力。 7. **数据传输**:在示例中,我们可以看到如何使用WriteFuture和ReadFuture来...

    mina server开发服务端/客户端代码

    本压缩包包含的是使用Mina Server开发的服务端和客户端的源代码示例,非常适合初学者和有经验的开发者用来学习和参考。 服务端开发: 在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接...

    Mina开发实例(服务端、客户端)DEMO

    Apache Mina是一个高度可扩展的网络通信框架,它允许开发者创建高性能、高效率的服务端和客户端应用程序。在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。...

    一个源代码学习服务端 ,基于mina

    掌握如何创建和配置Mina服务器,以及如何处理进来的网络连接和数据。 2. **网络通信**:熟悉TCP/IP协议栈,了解套接字编程,理解如何通过Mina进行数据传输和事件驱动的编程。 3. **CSV处理**:学习如何使用Java...

    mina2服务端客户端实例,保证能够正常运行

    标题中提到的"mina2服务端客户端实例"是指使用Apache MINA 2版本创建的一个工作示例,该示例包含了服务端和客户端的完整代码,旨在帮助开发者理解如何在实际项目中运用MINA进行网络通信。通过导入Eclipse这样的集成...

    AndroidMina服务端和客户端的实现

    本文将详细介绍如何在Android上实现Mina服务端和客户端,以及它们的主要功能。 首先,我们来看服务端(MinaServer)的实现。在服务端,Mina提供了一个Acceptor,它是监听特定端口并处理连接请求的对象。在创建...

    mina 长连接 客户端+服务端

    Mina 提供了一套完整的API来创建客户端和服务端,包括创建Socket通道、处理I/O事件、编码和解码数据等。下面我们将详细讲解如何利用Mina实现长连接的客户端和服务端: 1. **服务端实现**: - 首先,我们需要创建一...

    Apache MINA 线程模型配置

    在 Apache MINA 2.0 中,线程模型有了较大的改进,提供了一个更为灵活和强大的配置选项。这使得开发者能够更好地根据自己的应用需求调整线程池大小和其他参数,以达到最佳性能。 #### 二、线程模型配置方法 ##### ...

    Mina断包,粘包处理(完整实例,有客户端,服务端)

    在Java开发中,Mina(Java Minimal Asynchronous Network Engine)是一个强大的网络编程框架...通过分析Android-Mina-master项目中的代码,我们可以学习到如何在实际应用中解决这些问题,提高网络通信的可靠性和效率。

    mina框架中socket使用,有服务端和客户端。

    通过运行服务端和客户端,可以观察数据交互的过程,理解MINA如何处理网络事件和数据传输。此外,你还可以尝试修改代码,添加新的功能,进一步提升对MINA的理解。 通过这个项目,开发者不仅可以学习到MINA框架的基础...

    使用mina框架实现cmpp2.0服务端

    **使用mina实现CMPP2.0服务端的关键点** 1. **连接管理**:使用Mina的Acceptor来监听特定端口,接受来自移动网关的连接请求。每个连接通常对应一个独立的工作线程,处理来自客户端的CMPP请求。 2. **会话建立**:...

    mina mmorpg服务端源码

    "mina mmorpg服务端源码"是一个专注于游戏服务器端开发的项目,其核心技术是基于Apache Mina框架,并采用了AMF3编解码格式,这为高效的数据传输和游戏逻辑处理提供了坚实的基础。 Apache Mina是一个开源的网络通信...

    mina多线程

    Mina广泛应用于客户端/服务端(C/S)架构的开发中,能够帮助开发者简化底层网络通信的复杂性,提供更高层次的API接口来处理数据传输和通信逻辑。这使得开发者可以更专注于业务逻辑的实现而非网络编程的细节。 ### ...

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

    1. **非阻塞I/O**:MINA使用Java NIO(非阻塞I/O)库,这允许在单个线程中处理多个连接,极大地提高了系统资源的利用率和并发性能。 2. **事件驱动**:MINA基于事件驱动的设计,通过监听网络事件(如连接建立、数据...

    服务端基于MINA2的UDP双向通信Demo演示(Java客户端)

    标题中的“服务端基于MINA2的UDP双向通信Demo演示(Java客户端)”是指使用Apache MINA框架在Java中实现的UDP(用户数据报协议)的双向通信示例。MINA是一个高性能、异步的网络应用程序框架,常用于构建网络服务,如...

    mina_tcp服务端需要jar包.zip

    3. **缓冲区管理**:MINA使用Buffer对象来存储和操作数据,它支持多种数据类型,如ByteBuffer和MinaBuffer,提供了高效的数据读写和管理机制。 4. **过滤器链**:MINA的Filter(过滤器)机制允许用户自定义多个处理...

    apache mina-spring 服务端程序

    3. **业务处理器**:实现了Mina的IoHandler接口,处理来自客户端的事件和数据。 4. **协议编码解码器**:用于将网络传输的数据转换为业务对象,反之亦然,可能实现了Mina的ProtocolCodec接口。 5. **测试用例**:...

Global site tag (gtag.js) - Google Analytics