如果对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处理与业务处理单线程池问题
分享到:
相关推荐
压缩包子文件的文件名称列表中只有一个条目:"apache-mina-2.0.16-jar包-代码",这意味着压缩包内仅包含Apache Mina 2.0.16的源码JAR文件。开发者通常会用这个文件来导入到IDE中,例如Eclipse或IntelliJ IDEA,然后...
Apache Mina是一个高性能的网络应用框架,主要用于简化网络服务的开发,如TCP/IP和UDP通信。在Mina中,ByteBuffer的使用是至关重要的,因为它提供了高效的数据读写机制。本篇将深入探讨Java NIO(非阻塞I/O)中的...
从压缩包子文件的文件名称列表"apache-mina-2.0.7"来看,解压后应该会得到一个包含MINA框架源码目录结构的文件夹,里面可能包括以下组成部分: 1. **核心库**:包含MINA的核心组件,如Buffer、Filter、Session、...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是TCP/IP和UDP/IP协议的应用。MINA提供了一种高级的、高性能的、异步事件驱动的...
在这个"apache-mina源码"中,我们可以深入理解MINA的设计原理和实现细节。 MINA的核心概念包括: 1. **IoSession**:IoSession是MINA中的核心组件,代表了服务端和客户端之间的连接。它包含了会话的状态信息,如...
对于希望提高网络应用性能或熟悉Java NIO编程的开发者来说,Apache Mina 2.0.4的源码分析是一次宝贵的学习机会。你可以通过阅读源码学习到如何有效地处理高并发场景,如何设计和实现高效的网络协议,以及如何利用...
在Apache Mina框架中,IoFilter是核心组件之一,用于拦截和过滤I/O操作中的各种信息,可以类比于Servlet中的过滤器。这些过滤器提供了强大的机制来控制数据的传输和处理流程。Apache Mina的IoFilter主要有以下作用:...
关于apache组织的mina通信框架,可替代 java.NIO.Selector 的更好选择, 里面包括 mina 2.07版本的源码,编译好的jar文件,以及一些网络上找来的网摘资料文档 [截至2013年10月止]。 打包文件名:...
apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...
描述中的"源码"指的是Apache MINA的源代码,这部分是项目的原始程序文本,包含了MINA的所有类、方法和注释。源码包("apache-mina-2.0.7-src.zip")对于开发者来说非常有价值,因为它允许他们深入理解MINA的工作原理...
Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高并发的网络应用程序,如服务器端应用。它提供了一种简单而强大的编程模型,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。Spring...
2. **分析源码**:通过阅读MINA的源码,了解其内部处理流程,如读写事件的处理、过滤器链的工作方式等。 3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **...
在分析"apache-mina-2.0.4"源码时,我们可以深入理解其设计理念、架构以及核心组件。 1. **MINA的设计理念** MINA的核心理念是异步非阻塞I/O,它利用Java NIO(New I/O)库来实现高效的网络通信。通过非阻塞I/O,...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。MINA 提供了一个高级的网络应用编程接口(API),支持...
### Mina2源码分析——核心模块解析 #### 概述 Mina2是一个高性能、可扩展的网络应用框架,支持多种传输协议如TCP、UDP等,并提供了丰富的API供开发者使用。本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和...
标题中的“Apache MINA框架相关资料”涵盖了对MINA框架的全面学习材料,包括中文参考手册、源码分析、API文档和与Spring框架的整合指南。 1. **中文参考手册**(Apache_Mina_Server_2.0中文参考手册V1.0.pdf):这...
《mina-core-2.0.0-RC1:Apache MINA框架的核心组件解析》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展的网络应用开发框架,主要用于构建高性能、高可用性的网络服务器...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为开发高性能、高可用性的网络应用程序而设计。MINA提供了异步事件驱动的网络应用编程接口(API),支持多种传输协议,如...