`
rrsy23
  • 浏览: 185477 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

apache MINA 源码级分析-[壹]

阅读更多

如果对MINA不了解请看

http://rrsy23.iteye.com/blog/422589

http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/

 

我们首先看一个MINA最简单的服务器代码 如下

package org.apache.mina.example.echoserver;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
import org.apache.mina.filter.ssl.SslFilter;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class Main {
    public static void main(String[] args) throws Exception {
        SocketAcceptor acceptor = new NioSocketAcceptor();
        acceptor.setReuseAddress(true);
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

        chain.addLast("logger", new LoggingFilter());
        //这里是演示所以是单线程,实际是new ProtocolCodecFilter(new ImageCodecFactory(false))
        // chain.addLast("threadPool", new ExecutorFilter(Executors.newSingleThreadExecutor()));
        // Bind
        acceptor.setHandler(new EchoProtocolHandler());
        acceptor.bind(new InetSocketAddress(8080));
        System.out.println("Listening on port " + 8080);


    }

 

我们执行这段代码,然后用telnet连接看看 情况如何?

 

org.apache.mina.example.echoserver.Main
size is 3
[15:26:38] INFO [org.apache.mina.transport.socket.nio.NioSocketAcceptor] - init prepare Selector.open() Thread info--> main

Listening on port 8080

[15:26:41] INFO [org.apache.mina.transport.socket.nio.NioSocketAcceptor] - accept an client connection thread info-->NioSocketAcceptor-1
[15:26:41] INFO [org.apache.mina.filter.logging.LoggingFilter] - OPENEDThread info--> NioProcessor-1 nextFilter is class org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1
[15:26:41] INFO [org.apache.mina.example.echoserver.EchoProtocolHandler] - OPENED Thread info--> NioProcessor-1
[15:26:43] INFO [org.apache.mina.transport.socket.nio.NioSocketAcceptor] - accept an client connection thread info-->NioSocketAcceptor-1
[15:26:43] INFO [org.apache.mina.filter.logging.LoggingFilter] - OPENEDThread info--> NioProcessor-2 nextFilter is class org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1
[15:26:43] INFO [org.apache.mina.example.echoserver.EchoProtocolHandler] - OPENED Thread info--> NioProcessor-2
[15:26:45] INFO [org.apache.mina.transport.socket.nio.NioSocketAcceptor] - accept an client connection thread info-->NioSocketAcceptor-1
[15:26:45] INFO [org.apache.mina.filter.logging.LoggingFilter] - OPENEDThread info--> NioProcessor-3 nextFilter is class org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1
[15:26:45] INFO [org.apache.mina.example.echoserver.EchoProtocolHandler] - OPENED Thread info--> NioProcessor-3
[15:26:50] INFO [org.apache.mina.transport.socket.nio.NioSocketAcceptor] - accept an client connection thread info-->NioSocketAcceptor-1
[15:27:01] INFO [org.apache.mina.example.echoserver.EchoProtocolHandler] - --sleeping wake up 20 seconds---
[15:27:01] INFO [org.apache.mina.filter.logging.LoggingFilter] - OPENEDThread info--> NioProcessor-1 nextFilter is class org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1
[15:27:01] INFO [org.apache.mina.example.echoserver.EchoProtocolHandler] - OPENED Thread info--> NioProcessor-1
[15:27:03] INFO [org.apache.mina.example.echoserver.EchoProtocolHandler] - --sleeping wake up 20 seconds---
[15:27:05] INFO [org.apache.mina.example.echoserver.EchoProtocolHandler] - --sleeping wake up 20 seconds---

 

以上是执行的日志信息[本人在源代码增加了日志,mina的日志真是差啊]

 

下面我们分析哈日志看看问题:

 首先我们看到2中类型的线程池

   一:NioSocketAcceptor

   二:NioProcessor

每次客户端连接 服务器都是NioSocketAcceptor接受请求转给NioProcessor

 第一次连接NioProcessor-1 执行LoggingFilter在执行EchoProtocolHandler[这里线程我让他sleep 20秒]

 第二次连接NioProcessor-2 执行LoggingFilter在执行EchoProtocolHandler[这里线程我让他sleep 20秒]

 第三次连接NioProcessor-3 执行LoggingFilter在执行EchoProtocolHandler[这里线程我让他sleep 20秒]

 第四次连接NioSocketAcceptor accept以后转交给NioProcessor但是NioProcessor线程池线程用完,只能阻塞[线程池大小是3,为什么是3,下面看代码] 第一个线程执行完毕 来处理第四个请求

 

这样我们明白 我们的 业务处理实现IOHandler的类和IoProcessor用一个线程,这样一旦我们的处理类阻塞则服务器就停滞了;

 

这样:就是我第一步内容说的 相当于只有2个车间,我们需要把 2车间拆分为 2个车间异步[流水]作业

 

具体拆分 上面看代码,打开 注释就ok了

 

我们简单看看源代码: 

 

我们首先

SocketAcceptor acceptor = new NioSocketAcceptor();

 

那么到底做了什么我们看看NioSocketAcceptor构造器吧

 

public NioSocketAcceptor() {
        super(new DefaultSocketSessionConfig(), NioProcessor.class);
        ((DefaultSocketSessionConfig) getSessionConfig()).init(this);
    }

 

我们在看看super(new DefaultSocketSessionConfig(), NioProcessor.class);
这个代码

 

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

 

看看上面蓝色色代码,构造IoProcessorPool线程池了 那大小是几

看看构造器

 public SimpleIoProcessorPool(Class<? extends IoProcessor<T>> processorType) {
        this(processorType, null, DEFAULT_SIZE);
         System.out.println("size is "+DEFAULT_SIZE);
    }

private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;

 

明白了,就是cpu数+1 本机器是一个cpu双核的 所以是3

 

但是不要忘记 3要做的事情很多 项目希望把 业务处理的事情不让这个3做

 

http://rrsy23.iteye.com/blog/422703 解决 io处理与业务处理单线程池问题

分享到:
评论
3 楼 rrsy23 2012-07-14  
是线程数量 也就是线程池大小  不过支持自己修改 我说的是默认
2 楼 季铵盐 2012-06-19  
private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;

明白了,就是cpu数+1 本机器是一个cpu双核的 所以是3
????
这里获取的值应该是线程数量哈.
1 楼 rrsy23 2009-10-13  
其实觉得线程这个东西 真要是 N多长处理问题 也难以解决!

我是觉得

一个线程池 好处是 简单 一般系统没有什么问题

           确定是 上文所说

2个线程池 好处 线程池大小 可以动态调节

          缺点 和一个线程池 比 本人觉得 没有什么

线程开多了 闲置未必好

这个 只是自己 想没用时间 测试

建议 还是 弄点 环境测试哈

相关推荐

    apache-mina-2.0.16-jar包-代码.zip

    压缩包子文件的文件名称列表中只有一个条目:"apache-mina-2.0.16-jar包-代码",这意味着压缩包内仅包含Apache Mina 2.0.16的源码JAR文件。开发者通常会用这个文件来导入到IDE中,例如Eclipse或IntelliJ IDEA,然后...

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    Apache Mina是一个高性能的网络应用框架,主要用于简化网络服务的开发,如TCP/IP和UDP通信。在Mina中,ByteBuffer的使用是至关重要的,因为它提供了高效的数据读写机制。本篇将深入探讨Java NIO(非阻塞I/O)中的...

    apache-mina-2.0.7-src.zip

    从压缩包子文件的文件名称列表"apache-mina-2.0.7"来看,解压后应该会得到一个包含MINA框架源码目录结构的文件夹,里面可能包括以下组成部分: 1. **核心库**:包含MINA的核心组件,如Buffer、Filter、Session、...

    apache-mina-3.0.0-M2-src.zip

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是TCP/IP和UDP/IP协议的应用。MINA提供了一种高级的、高性能的、异步事件驱动的...

    apache-mina源码

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

    apache-mina-2.0.4.rar_apache mina_mina

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

    深入理解Apache Mina (2)---- 与IoFilter相关的几个类

    在Apache Mina框架中,IoFilter是核心组件之一,用于拦截和过滤I/O操作中的各种信息,可以类比于Servlet中的过滤器。这些过滤器提供了强大的机制来控制数据的传输和处理流程。Apache Mina的IoFilter主要有以下作用:...

    apache_mina--2.0.7

    关于apache组织的mina通信框架,可替代 java.NIO.Selector 的更好选择, 里面包括 mina 2.07版本的源码,编译好的jar文件,以及一些网络上找来的网摘资料文档 [截至2013年10月止]。 打包文件名:...

    apache-mina-2.0.4架包及源码各pdf学习教程

    apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...

    apache-mina-2.0.7架包与源码

    描述中的"源码"指的是Apache MINA的源代码,这部分是项目的原始程序文本,包含了MINA的所有类、方法和注释。源码包("apache-mina-2.0.7-src.zip")对于开发者来说非常有价值,因为它允许他们深入理解MINA的工作原理...

    apache mina-spring 服务端程序

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

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

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

    mina 源码

    在分析"apache-mina-2.0.4"源码时,我们可以深入理解其设计理念、架构以及核心组件。 1. **MINA的设计理念** MINA的核心理念是异步非阻塞I/O,它利用Java NIO(New I/O)库来实现高效的网络通信。通过非阻塞I/O,...

    apache-mina-2.1.3所有jar和源文件.7z

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。MINA 提供了一个高级的网络应用编程接口(API),支持...

    Mina2源码分析

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

    Apache MINA框架相关资料

    标题中的“Apache MINA框架相关资料”涵盖了对MINA框架的全面学习材料,包括中文参考手册、源码分析、API文档和与Spring框架的整合指南。 1. **中文参考手册**(Apache_Mina_Server_2.0中文参考手册V1.0.pdf):这...

    mina-core-2.0.0-RC1

    《mina-core-2.0.0-RC1:Apache MINA框架的核心组件解析》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展的网络应用开发框架,主要用于构建高性能、高可用性的网络服务器...

    mina-2.0.0-M3.zip

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为开发高性能、高可用性的网络应用程序而设计。MINA提供了异步事件驱动的网络应用编程接口(API),支持多种传输协议,如...

Global site tag (gtag.js) - Google Analytics