`
michael.softtech
  • 浏览: 208580 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Mina 源码分析

 
阅读更多

终于又有时间和精力来写写东西啦,真开心~

这两天闲来没事翻了翻Mina的源码,小有感触,于是决定简单分享一下。

从服务端出发来分析一下吧。Mina有这么几个核心的接口类:

IoAcceptor:  启动server段监听,启动Acceptor线程,处理连接请求同时生成IoSession并放到一个数组里面。

IoProcessor: 启动Processor线程。循环处理上面提到的数组里面的IoSession. 该读读,该写写。

IoSession:    客户端和服务端的会话抽象

IoFilter:         Mina用来处理消息的节点链中的节点

IoHander:     Mina事件监听类。通常也是客户化开发需要扩展的基础接口。

 

闲言少叙,上一张自己画的sequence 图。因为是第一次画这种图,如有不妥请童鞋们指正~

 

 哈哈通过这张图,什么Nio啊,异步什么的就比较能够明显看出来了。

 

 至于NIO,在NioAcceptor里面,对连接请求的处理是通过Selector来实现的。具体可参考java NIO.

 至于异步,可以发现,实际上的读写都是最终通过Processor来实现的。客户端的读写都是放到一个队列里面,

 Processor 不断loop以完成对队列读写的实际操作并且在完成时设置FutureOperation的标志位。

 

 

还有一些细节的东西,比如Acceptor是只有一个线程,而Processor是有多个线程的。默认情况下Processor的线程数是

主机CPU个数+1 。

 

这个的原理是:

 

为了以下描述的清晰性,先贴一下Demo 代码,以方便以下的分析:

public static void main(String[] args) throws Exception {
        SocketAcceptor acceptor = new NioSocketAcceptor();
        acceptor.setReuseAddress( true );
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
        
        // Add SSL filter if SSL is enabled.
        if (USE_SSL) {
            addSSLSupport(chain);
        }

        // Bind
        acceptor.setHandler(new EchoProtocolHandler());
        acceptor.bind(new InetSocketAddress(PORT));

        System.out.println("Listening on port " + PORT);
        
        for (;;) {
            System.out.println("R: " + acceptor.getStatistics().getReadBytesThroughput() + 
                ", W: " + acceptor.getStatistics().getWrittenBytesThroughput());
            Thread.sleep(3000);
        }
    }
 

 

在AbstracePoolingIoAcceptor构造的时候,传入的processor 是一个SimpleIoProcessorPool的实例,这个类的作用就是维护一个默认CPU+1数量的IoProcessor池。入口如下:

protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
            Class<? extends IoProcessor<T>> processorClass) {
        this(sessionConfig, null, new SimpleIoProcessorPool<T>(processorClass),
                true);
    }
 

 

private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
public SimpleIoProcessorPool(Class<? extends IoProcessor<T>> processorType) {
        this(processorType, null, DEFAULT_SIZE);
    }
 

 

    每次调用IoProccesor(在我们的例子里面是SimpleIoProcessorPool)的add方法的时候,会随机从IoProcessor池里面取一个实例然后与要add的session关联。于是实际调用的就是NioProcessor的add方法. 通过这种方式,每个被调用过的IoProcessor都会启动一个自己的Processor线程。

   贴一下为add过程的源码:

 

 

SimpleIoProcessorPool 类
public final void add(T session) {
        getProcessor(session).add(session);
    }

private IoProcessor<T> getProcessor(T session) {
        IoProcessor<T> processor = (IoProcessor<T>) session.getAttribute(PROCESSOR);
        
        if (processor == null) {
            processor = nextProcessor(session);
            session.setAttributeIfAbsent(PROCESSOR, processor);
        }

        return processor;
    }

private IoProcessor<T> nextProcessor(T session) {
        if (disposed) {
            throw new IllegalStateException(
                    "A disposed processor cannot be accessed.");
        }
        
        return pool[Math.abs((int)session.getId()) % pool.length];
    }

 

    通过代码很清晰的能够看到, 实际上的add 调用还是NioProcessor的 add 调用。

 

分享到:
评论

相关推荐

    MINA源码分析,内涵类的讲解

    在这个“MINA源码分析,内涵类的讲解”中,我们将深入探讨MINA的核心组件和设计模式,以便更好地理解和利用这个强大的框架。 首先,我们需要了解MINA的基础架构。MINA的核心是`IoService`接口,它定义了服务端和...

    Mina2源码分析

    ### Mina2源码分析——核心模块解析 #### 概述 Mina2是一个高性能、可扩展的网络应用框架,支持多种传输协议如TCP、UDP等,并提供了丰富的API供开发者使用。本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和...

    Mina源码解析

    在深入解析Mina源码的过程中,我们可以从以下几个关键知识点入手: 1. **Mina的过滤器机制实现**: Mina的核心设计理念之一是过滤器链(Filter Chain),它借鉴了Servlet的过滤器模型。每个过滤器都可以在数据传输...

    apache-mina源码

    在这个"apache-mina源码"中,我们可以深入理解MINA的设计原理和实现细节。 MINA的核心概念包括: 1. **IoSession**:IoSession是MINA中的核心组件,代表了服务端和客户端之间的连接。它包含了会话的状态信息,如...

    Mina学习资料

    四、Mina源码分析 1. Acceptor:负责监听端口并接受新连接。在Mina源码中,Acceptor是一个服务端的启动类,它创建了一个NioSessionAcceptor,用于处理客户端的连接请求。 2. ProtocolDecoder和ProtocolEncoder:这两...

    mina 源码

    通过源码分析,我们可以了解到MINA如何优化性能,比如减少线程上下文切换,使用NIO的selector提高并发能力等。这些知识对于提升自己编写网络程序的能力大有裨益。 通过上述分析,我们可以看出,MINA是一个强大的...

    Mina2.0框架源码剖析

    通过深入分析Mina2.0的源码,我们可以了解到其内部的事件驱动模型、网络通信机制以及如何通过过滤器和处理器来处理网络请求。这有助于我们更好地理解和利用Mina框架来开发高并发、高性能的网络应用。

    Mina2源码分析.docx

    Mina2源码分析 Mina2框架源码剖析是 Java 编程语言中一个流行的网络编程框架,用于构建高性能、可扩展的网络应用程序。该框架核心包包括 org.apache.mina.core.service, org.apache.mina.core.session, org.apache....

    MINA 2.0.9源码

    此外,源码分析还能帮助你掌握如何自定义Filter和Codec,以满足特定的应用场景需求。 总之,MINA 2.0.9源码为开发者提供了一个深入学习网络编程和异步I/O的好资源,通过研究和实践,开发者可以提升自己的网络应用...

    mina学习资料与源码分析

    这个压缩包"mina学习资料与源码分析"包含了帮助你快速入门Mina、深入理解其工作原理和API的资源。下面,我们将深入探讨Mina的核心概念、功能以及如何利用它来开发网络应用。 Mina源于Java社区,其全称为“Minimal ...

    mina源码+例子mina-2.0.0-M6.zip

    2. **分析源码**:通过阅读MINA的源码,了解其内部处理流程,如读写事件的处理、过滤器链的工作方式等。 3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **...

    Mina 框架源码解析-构建简单通信程序

    通过分析源码,我们可以看到Mina如何优雅地将网络编程的复杂性封装起来,让开发者可以更专注于应用的业务层面。同时,通过心跳机制,我们能够实时检测网络状况,确保服务的稳定性和可靠性。 总的来说,Mina框架提供...

    Mina2源码分析.doc

    Apache Mina2是一个高效的、可扩展的网络应用框架,主要用于简化Java NIO(非阻塞I/O)编程。它的核心组件包括`IoService`、`IoAcceptor`、`IoConnector`、`IoProcessor`和`IoHandler`,这些组件共同协作以处理网络...

    Java mina2源码

    源码分析还能帮助我们理解Java的多线程、并发控制和事件驱动编程等高级特性,提升我们的编程技能和解决问题的能力。 此外,对于Java开发者来说,熟悉Mina2源码有助于理解其他类似的网络通信框架,比如Netty,因为...

    mina2 源码 mina

    标题"mina2 源码 mina"暗示我们将探讨MINA2的源代码,这是一个非常有价值的资源,对于理解MINA的工作原理、学习如何构建网络应用程序以及定制MINA的行为非常有用。MINA的源码包含了丰富的注释和示例,可以帮助开发者...

    Mina 1.1.7 示例源码(apache.mina.example)

    这个示例集合是为了学习和交流而准备的,开发者可以通过分析源码了解Mina如何处理网络通信,如何构建过滤器链,以及如何实现自定义的协议编码解码器。同时,这些示例也提供了实际操作的机会,便于开发者在遇到问题...

    Mina 2.0快速入门与源码解析

    接下来,我们将逐步深入分析 Mina 2.0 的核心组件及其实现原理。 **2.1 IoAcceptor** `IoAcceptor` 接口是 Mina 2.0 中的核心接口之一,它代表了一个网络服务端点。通过该接口可以设置各种处理器、配置参数以及...

    apache-mina-2.0.4.rar_apache mina_mina

    对于希望提高网络应用性能或熟悉Java NIO编程的开发者来说,Apache Mina 2.0.4的源码分析是一次宝贵的学习机会。你可以通过阅读源码学习到如何有效地处理高并发场景,如何设计和实现高效的网络协议,以及如何利用...

    apache下的mina框架的源码

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展且高性能的网络应用程序...通过深入研究MINA源码,开发者可以提升网络编程技能,为构建高效、可伸缩的网络应用打下坚实基础。

Global site tag (gtag.js) - Google Analytics