Mina的多线程模式

合集下载

深入理解Apache_Mina

深入理解Apache_Mina

Mina状态机介绍(Introduction to mina-statemachine)如果你使用Mina开发一个复杂的网络应用时,你可能在某些地方会遇到那个古老而又好用的状态模式,来使用这个模式解决你的复杂应用。

然而,在你做这个决定之前,你或许想检出Mina的状态机的代码,它会根据当前对象的状态来返回对接收到的简短的数据的处理信息。

注意:现在正式发布Mina的状态机。

因此你要自己在Mina的SVN服务器上检出该代码,并自己编译,请参考开发指南,来获取更多的关于检出和编译Mina源码的信息。

Mina的状态机可以和所有已经发布的版本Mina配合使用(1.0.x,1.1.x和当前发布的版本)。

一个简单的例子让我们使用一个简单的例子来展示一下Mina的状态机是如何工作的。

下面的图片展示了一个录音机的状态机。

其中的椭圆是状态,箭头表示事务。

每个事务都有一个事件的名字来标记该事务。

初始化时,录音机的状态是空的。

当磁带放如录音机的时候,加载的事件被触发,录音机进入到加载状态。

在加载的状态下,退出的事件会使录音机进入到空的状态,播放的事件会使加载的状态进入到播放状态。

等等......我想你可以推断后后面的结果:)现在让我们写一些代码。

外部(录音机中使用该代码的地方)只能看到录音机的接口:----------------------START----------------------public interface TapeDeck{void load(String nameOfTape);void eject();void start();void pause();void stop();}-----------------------END------------------------下面我们开始编写真正执行的代码,这些代码在一个事务被触发时,会在状态机中执行。

首先我们定义一个状态。

这些状态都使用字符串常量来定义,并且使用@state标记来声明。

Mina文档

Mina文档

Mina文档 Nio: NIO是一个基于事件的IO架构,最基本的思想就是:有事件我通知你,你再去做你的事情,没事件时你大可以节约大把时间去做其它任何事情。而且NIO的主线程only one,不像传统的模型,需要N个线程去,也减轻了JVM的工作量,使得JVM处理任务时显得更加高效。

Mina 综述 • Multipurpose Infrastructure for Network Applications • 一个基于非阻塞I/O的网络框架。 • 高可维护性,高可复用性:网络I/O编码,消息的编/解码,业务逻辑互相分离。 • 与JMX结合。 • 使用sfj4作为log • 支持UDP,支持客户端API。 • 由Netty2的作者Trustin Lee开始开发的。 • 相对容易进行单元测试 • MINA没有直接使用使用java NIO的ByteBuffer类。它使用一个自制的ByteBuffer来扩展java。如果你使用MINA,你将不需要直接使用NIO buffers,因为仅使用MINA buffers就可以完成大多数buffer操作。 Mina总体结构: IoSession •持有连接(服务端或客户端) •和每个事件一起通过 •主要方法 •write •close •get/setAttribute

IoHandler

•类似Servlet • filter chain的结尾部分。 •主要方法: •sessionOpened •messageReceived •sessionClosed IoFilterChain •一连串的IoFilter,和每个session对应 •可以为第个 IoConnector/IoAcceptor设置IoFilter模板。 •动态添加和移除。

IoFilters

•类似一个 ServletFilter •观察事件流。 •主要方法: •sessionOpened •messageReceived •filterWrite •sessionClosed

Mina官方教程_中文版

Mina官方教程_中文版

Mina官方教程_中文版简介: Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。

它提供了一个抽象的事件驱动的异步 API,可以使用TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。

Apache MINA 2 可以作为开发网络应用程序的一个良好基础。

本文将介绍 Apache MINA 2 的基本概念和 API,包括 I/O 服务、I/O 会话、I/O 过滤器和 I/O 处理器。

另外还将介绍如何使用状态机。

本文包含简单的计算器服务和复杂的联机游戏两个示例应用。

Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。

它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。

Apache MINA 2 可以作为开发网络应用程序的一个良好基础。

下面将首先简单介绍一下Apache MINA 2。

Apache MINA 2 介绍Apache MINA 是 Apache 基金会的一个开源项目,目前最新的版本是2.0.0-RC1。

本文中使用的版本是 2.0.0-M6。

从参考资料中可以找到相关的下载信息。

下面首先介绍基于 Apache MINA 的网络应用的一般架构。

基于 Apache MINA 的网络应用的架构基于 Apache MINA 开发的网络应用,有着相似的架构。

图 1中给出了架构的示意图。

图 1. 基于 Apache MINA 的网络应用的架构如图 1所示,基于 Apache MINA 的网络应用有三个层次,分别是 I/O 服务、I/O 过滤器和 I/O 处理器:⎽I/O 服务:I/O 服务用来执行实际的 I/O 操作。

Apache MINA 已经提供了一系列支持不同协议的 I/O 服务,如 TCP/IP、UDP/IP、串口和虚拟机内部的管道等。

开发人员也可以实现自己的 I/O 服务。

mina框架的构成和功能

mina框架的构成和功能

mina框架的构成和功能随着移动互联网的迅速发展,移动应用的开发需求也越来越高。

而mina框架作为一款高性能、灵活的网络通信框架,能够满足这些需求。

本文将介绍mina框架的构成和功能。

一、框架构成mina框架由三个核心部分组成:Acceptor、IoSession和FilterChain。

1. AcceptorAcceptor是mina框架的入口点,负责监听和接收客户端的连接请求。

当有新的连接请求到达时,Acceptor会创建一个IoSession来处理该连接。

2. IoSessionIoSession是mina框架中的核心对象,代表一个客户端与服务器之间的连接。

每个连接都有一个对应的IoSession对象。

通过IoSession,我们可以获取到客户端发送的数据、发送数据给客户端,以及管理连接的状态等。

3. FilterChainFilterChain是mina框架中的过滤器链,用于对客户端发送和接收的数据进行处理。

过滤器链中的每个过滤器都可以对数据进行读取、编码、解码、过滤等操作。

多个过滤器可以组成一个过滤器链,按照添加的顺序依次对数据进行处理。

二、框架功能1. 高性能的网络通信mina框架基于NIO技术,使用非阻塞的IO模型,能够处理大量的并发连接。

相比于传统的BIO模型,mina框架可以更高效地处理网络通信,提供更好的响应速度和吞吐量。

2. 灵活的协议支持mina框架提供了灵活的协议支持,可以根据实际需求自定义通信协议。

通过实现IoHandler接口,我们可以处理客户端发送的数据,并根据自定义的协议进行解码和编码操作。

这使得mina框架可以适用于各种不同的应用场景。

3. 多种编解码器支持mina框架提供了多种编解码器,可以方便地进行数据的编码和解码。

通过使用这些编解码器,我们可以将数据转换为不同的格式,实现数据的传输和解析。

同时,mina框架还支持自定义的编解码器,以满足特定的需求。

4. 异步事件驱动mina框架采用异步事件驱动的方式处理网络通信,可以处理多个连接的并发操作。

mina编码器详解

mina编码器详解
这样做可以分离协议逻辑和事务逻辑(IoHandler)。
怎样使用 ProtocolCodecFilter 呢?
应用程序基本上就是接收一串字节并且将这串字节转化为消息(较高级别的对象)。
有三种常用方法可以将字节流分离成消息:
. 使用固定长度的消息。 . 使用固定长度的标头指出消息内容主体的长度。 . 使用分隔符;例如很多基于文本的消息在消息的后面追加换行(或者 CR LF 组合)
this.height = height; this.numberOfCharacters = numberOfCharacters; }
public int getWidth() { return width;
}
public int getHeight() { return height;
}
public int getNumberOfCharacters() { return numberOfCharacters;
public class ImageRequestDecoder extends CumulativeProtocolDecoder {
protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
概述一下我们需要的编解码请求和响应类:
. ImageRequest:一个简单 POJO,表示向服务端的请求。 . ImageRequestEncoder:将请求对象编码成特定协议的数据(客户端使用) . ImageRequestDecoder:将特定协议的数据解码成请求对象(服务端使用) . ImageResponse:一个简单 POJO,表示来自服务端的响应。 . ImageResponseEncoder:服务端用来编码响应对象。 . ImageResponseDecoder:客户端用来解码响应对象。 . ImageCodecFactory:这个类用来创建必要的编码器和解码器。

mina源码解析

mina源码解析

mina源码解析Mina是一款基于Java的轻量级网络通讯框架,它支持TCP、UDP、SSL等协议。

Mina的核心是IoProcessor,它负责处理网络I/O事件,并将事件分发到IoHandler中处理。

本文将从源码的角度对Mina进行解析,探究其实现原理和内部机制。

一、IoServiceIoService是Mina的核心接口,它定义了启动、停止、监听和连接等方法。

Mina支持两种类型的IoService:IoAcceptor和IoConnector。

IoAcceptor用于监听并接受连接,而IoConnector用于主动连接其他服务端。

二、IoProcessorIoProcessor负责处理I/O事件,它是Mina的核心组件。

在Mina 中,每个IoService都有对应的IoProcessor。

当有新连接到来时,IoProcessor会创建一个IoSession并将其交给IoService处理。

三、IoFilterIoFilter是Mina的过滤器,可以用于对I/O事件进行拦截和处理。

Mina中的过滤器链是一种典型的责任链模式,每个过滤器都可以在I/O事件发生前、后或中间处理事件。

四、IoSessionIoSession是Mina的会话,它代表了一个TCP连接。

在Mina中,所有的I/O操作都是通过IoSession进行的。

IoSession中包含了该会话的所有状态信息,如连接状态、读写缓冲区等。

五、IoHandlerIoHandler是Mina的处理器,用于处理IoSession中的I/O事件。

当有新数据到达时,IoHandler会被调用,并处理该事件。

六、总结Mina是一款轻量级的网络通讯框架,其核心是IoProcessor、IoFilter、IoSession和IoHandler。

通过对Mina源码的分析,我们可以了解其内部机制和实现原理,从而更好地使用和理解Mina框架。

MINA2官方教程翻译.

MINA2官方教程翻译(1)2.x与1.x的变化文章分类:Java编程一、包与命名所有的类和方法严格使用驼峰法命名。

例如SSLFilter被更名为SslFilter,其它很多类也是如此。

所有NIO传输类在命名时增加‘Nio’前缀。

因为NIO并不只是socket/datagram传输的实现,所有‘Nio’前缀加在了所有的NIO传输类上。

改变之前:Java代码1.SocketAcceptor acceptor=new SocketAcceptor();改变之后:Java代码1.SocketAcceptor acceptor=new NioSocketAcceptor();Filter类被重新整理进多重子包内。

随着框架自带的filter实现的数量的增加,所有的filter都被移动到适当的子包中(例如,StreamWriteFilter移至org.apache.mina.filter.stream)。

*.support的所有包被移动到了其父包(或者其他包)中。

为了避免循环依赖,*.support包中的所有类都被移至其父包或者其他包中。

你可以在IDE(例如Eclipse)中简单的修正这些包的导入从而避免编译错误。

二、BuffersMINA ByteBuffer被重命名为IoBuffer。

因为MINA ByteBuffer与JDK中NIO ByteBuffer同名,很多用户发现与其组员沟通时存在很多困难。

根据用户的反馈,我们将MINA ByteBuffer重命名为IoBuffer,这不仅使类名称简化,也是类名称更加明晰。

放弃Buffer池,默认使用IoBuffer.allocate(int)来分配heap buffer。

•acquire()与release()两个方法将不再是容易发生错误的。

如果你愿意,你可以调用free()方法,但这是可选的。

请自己承担使用这个方法的风险。

•在大多数JVM中,框架内置的IoBuffer性能更加强劲、稳定。

mina框架使用总结

MINA框架使用总结简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。

下面这个start方法用来初始化MINA:Java代码1.private void start(int port, WebContext ctx)2.throws IOException, InstantiationException3. , IllegalAccessException, ClassNotFoundException {4.//初始化Acceptor5. NioSocketAcceptor acceptor = new NioSocketAcceptor(5);6.7. java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);//建立线程池8.//加入过滤器(Filter)到Acceptor9. acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));10.acceptor.getFilterChain().addLast("codec",11.new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));12. LoggingFilter filter = new LoggingFilter();13. filter.setExceptionCaughtLogLevel(LogLevel.DEBUG);14. filter.setMessageReceivedLogLevel(LogLevel.DEBUG);15. filter.setMessageSentLogLevel(LogLevel.DEBUG);16. filter.setSessionClosedLogLevel(LogLevel.DEBUG);17. filter.setSessionCreatedLogLevel(LogLevel.DEBUG);18. filter.setSessionIdleLogLevel(LogLevel.DEBUG);19. filter.setSessionOpenedLogLevel(LogLevel.DEBUG);20. acceptor.getFilterChain().addLast("logger", filter);21.22. acceptor.setReuseAddress(true);//设置的是主服务监听的端口可以重用23.24. acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用25. acceptor.getSessionConfig().setReceiveBufferSize(1024);//设置输入缓冲区的大小26. acceptor.getSessionConfig().setSendBufferSize(10240);//设置输出缓冲区的大小27.//设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出28. acceptor.getSessionConfig().setTcpNoDelay(true);29.//设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务器拒绝30. acceptor.setBacklog(100);31. acceptor.setDefaultLocalAddress(new InetSocketAddress(port));32.//加入处理器(Handler)到Acceptor33. acceptor.setHandler(new WebHandler());34. acceptor.bind();35.}NioSocketAcceptor是MINA的适配器,一切都是从这里开始的。

Mina

Mina聊天室框架简介1.1 Mina概念Mina基于IO层、协议层的网络应用框架,封装了socket通讯的实现1.2 Mina常用接口●IoAcceptor相当于网络应用程序中的服务器端,作为线程运行,负责接受来自客户的请求,使用bind()方法绑定特定端口,线程监听该端口请求状态,当有客户请求连接时,创建一个Session●IoConnector相当于客户端,调用connect()方法,启动一个线程连接服务端●IoSession服务器与客户端的特定连接,该连接由服务器地址、端口以及客户端地址、端口来决定。

客户端发起请求时,指定服务器地址和端口,客户端也会指定或者根据网络路由信息自动指定一个地址、自动分配一个端口。

这个地址、端口对构成一个Session.一个IoSession代表了程序同一个远程实体的IO连接。

通过IoSession,可以写出message 到远程实体,访问session的配置,并且更改session的属性。

IoSession提供以下一些常用方法:(1)setAttribute(Object key, Object value)/getAttribute(Object key)设置/获取用户定义的属性。

将该属性与session联系起来,方便以后处理用户请求时使用。

比如如果要求用户登录后才能继续进行操作,那么在用户成功登陆后,可以通过setAttribute()设置一个属性,当用户以后继续请求时,可以通过getAttribute()获取该属性来判断用户是否登录。

(2)getRemoteAddress()获取远程客户端地址。

(3)getId() getCreationTime() /getLastIoTime() getConfig()获取Session的Id、创建时间、上次IO时间、配置信息。

(4)write(Object message)将数据发送给客户端。

(5)close()关闭Session。

Mina2.0完全自学手册要点

远程通信Mina2 学习笔记引言 (3)一.Mina入门 (3)第一步.下载使用的Jar包 (3)第二步.工程创建配置 (3)第三步.服务端程序 (4)第四步.客户端程序 (7)第五步.长连接VS短连接 (9)二.Mina基础 (11)1.IoService接口 (12)2.1.1 类结构 (12)2.1.2 应用 (13)2.IoFilter接口 (15)2.2.1 类结构 (15)2.2.2 应用 (17)添加过滤器 (17)自定义编解码器 (18)制定协议的方法: (20)IoBuffer常用方法: (20)Demo1:模拟根据文本换行符编解码 (21)Demo2:改进Demo1的代码 (23)Demo3:自定义协议编解码 (33)3.IoHandler接口 (51)三.Mina实例 (51)四.其他................................................ 错误!未定义书签。

引言最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache 的这个Mina框架。

首先,Mina是个什么东西?看下官方网站(/)对它的解释:Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。

Apache Mina也称为:●NIO框架●客户端/服务端框架(典型的C/S架构)●网络套接字(networking socket)类库总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!(本文所有内容仅针对Mina2.0在TCP/IP协议下的应用开发)一.Mina入门先用Mina做一个简单的应用程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Mina的多线程模式——节选自设计文档
1.1 多线程模式

由于本项目使用的 Apache Mina 的框架进行网络通信。当然其多线程模式也应该
在 Mina 框架中体现出来。

为了理解多线程模式,首先要了解 Mina 的运作方式。
1.1.1 Mina 的通信过程
此次便于解说,假设客户端也是采用了 Mina 框架来进行,实际上本项目的客户端只是
简单的使用了windows 的 Socket 通信。在当前假设下,其通信过程如下图 16 所示。

图 16 Apache Mina 的通信过程
本项目只关注服务端,其服务端的通信过程如下:
1 、通过 SocketAcceptor 同客户端建立连接;
2 、链接建立之后 I/O 的读写交给了 I/O Processor 线程, I/O Processor 是多线程的;
3 、通过 I/O Processor 读取的数据经过 IoFilterChain 里所有配置
的 IoFilter , IoFilter 进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协
议;
4 、最后 IoFilter 将数据交给 Handler 进行业务处理,完成了整个读取的过程;
5 、写入过程也是类似,只是刚好倒过来,通过 IoSession.write 写出数据,然
后 Handler 进行写入的业务处理,处理完成后交给 IoFilterChain ,进行消息过滤和协议的
转换,最后通过 I/O Processor 将数据写出到 socket通道。

1.1.2 Mina 的多级线程池

服务端的一个简化过程如下图 17 所示:

图 17 多级线程池
在基于 SocketAcceptor 的应用程序中,运行过程中 Mina 框架本身会有两种类型的线
程在运行,一种是在SocketAcceptor 中创建的用于监听并接收来自客户端请求的线程,还
有一类线程是处理客户端与服务器端 I/O 的线程,即 Processor 的处理线程。后面还有第三
类,就是过滤器层的线程。这个多级的概念后面你会体会到,Acceptor 是一级线程池,
而 Processor 的线程池主要通过 ExecutorFileter 进行添加,当然可以添加多个层次的线程
池。下面逐层进行讲解。

1 、第一类线程池:
当调用 SocketAcceptor 的 bind 方法时,默认会创建一个名称前缀
为 SocketAcceptor 的线程,该线程负责监听来自客户端的请求,如果接收到客户端的请求,
它仅仅是为处理这个请求做好准备,而把具体处理请求以及I/O 的任务代理
给 SocketIoProcessor ,让它去处理请求。这个准备过程主要是为接受到的请求创建一
个 IoSession ,并构建出 IoFilter 链,然后把准备好的数据以及来自客户端的请求交
给 SocketIoProcessor 处理。通常 这类线程会针对每一次的 bind 调用创建一个新的线程。

请注意 “通常 ” 二字,使用这两个字说明上述的行为不是绝对的。的确这不是绝对
的,这取决于SocketAcceptor 的字段 executor 的实现,可以通过构造方法来设置字
段 executor 的值, executor 字段的类型为 java.util.concurrent.Executor 。 mina 默认是
用 org.apache.mina.util.NewThreadExecutor ,它会为每一个提交的任务创建一个新的线程。
因为在 bind 方法中它会把实现监听客户端请求任务的 Runnable 提交到 executor中去执行。
注意千万不要使用一个不创建新线程而是在原线程中执行的 Executor ,这会使程序无法监
听客户端的请求,因为程序中的唯一线程会被 Selector.get() 方法所阻塞,详情可以查
看 SocketAcceptor 类的源代码。

第二类线程池:
当 SocketAcceptor 收到了来自客户端的请求,它就会把此请求丢
给 SocketIoProcessor 去处理,这会创建名称以 SocketAcceptorIoProcessor 为前缀的线
程, mina 框架在这类线程中处理 I/O 发布并处理事件。这一类线程的数量可以通
过 SocketAcceptor 的构造函数来设置。具体的值可以根据应用的具体需求来决定。

作为 I/O 真正处理的线程,存在于服务器端和客户端,用来处理 I/O 的读写操作,线
程的数量是可以配置的,默认最大数量是 CPU 个数 +1 。

在服务器端中,在创建 SocketAcceptor 的时候指定 ProcessorCount 。
SocketAcceptor acceptor =
new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1,
Executors.newCachedThreadPool());

NioProcessor 虽然是多线程,但是对与一个连接的时候业务处理只会使用一个线程进
行处理( Processor线程对于一个客户端连接只使用一个线程 NioProcessor-n )如
果 handler 的业务比较耗时,会导致NioProcessor 线程堵塞 ,在 2 个客户端同时连接上来
的时候会创建第 2 个(前提是第 1 个 NioProcessor 正在忙),创建的最大数量
由 Acceptor 构造方法的时候指定。如果:一个客户端连接同服务器端有很多通信,并且
I/O 的开销不大,但是 Handler 处理的业务时间比较长,那么需要采用独立的线程模式,
在 FilterChain 的最后增加一个 ExecutorFitler ,这个就是第三类线程池了。

第三类线程池:
上述的两类线程是 mina 框架本身所创建的,如果你的应用每次处理请求的时间较长而
又希望应用能够有较好的响应性,那么最好是把处理业务逻辑的任务放到一个新的线程中去
执行,而不是在 mina 框架创建的线程中去执行。 mina 框架本身提供了一个过滤
器 ExecutorFilter 来完成这样的任务,它会把在此之后的过滤器以及IoHandler 中处理业务
逻辑的代码放到一个新的线程中去执行。当 mina 框架中的第二类线程执行完此过滤器后就
会立即返回,可以用于处理新的请求。如果不想使用此过滤器,还可以设置 mina 的线程模
型来达到相同的效果,其实线程模型也是使用 ExecutorFilter 实现的。但需要注意的是,
在 mina 2.0 版本中已经废弃了线程模型。

使用类这三次线程池,性能可以得到保证了,在本项目中,主要配置了第二类线程池
和第三类线程池。第二类线程池在新建 NioAcceptor 对象(以建立 TCP 监听服务器为例)
时候,在其构造函数中体现,而这个数值需要多次测试来设定,其测试方法在国外网站有完
整表述,请自行 Google ;第三类线程池设定在 Apache Mina 的过滤器层,一般而言只需
要设置一层,设置在最消耗时间的业务前面,如比较复杂的解码,或者是数据库访问模块。

关于共享线程池问题, Apache Mina 有个官方说法:你可以想
让 IoServices 和 ExecutorFilters 共享一个线程池,而不是一家一个。这个是不禁止的,
但是会出现很多问题,在这种情况下,除非你为 IoServices 建立一个缓冲线程池。 本人尚
未考究。

相关文档
最新文档