apache Mina分析小结(1.1.7)

   thomescai http://blog.csdn.net/thomescai(转载请保留)

   看了ChinaEstone的《深入理解ApacheMina 》,也写点小结。

主要框架:

    下面是MIna的流程图:

apache Mina分析小结(1.1.7)_第1张图片 

    Mina主要类图如下:

    1.SocketAcceptor对应IoService。SocketIoProcessor对应IoProcessor。

    2.SocketAcceptor有一个thread:该线程的作用是接收客户端的连接,并将客户端的连接导入到I/O processor线程模型中SocketIoProcessor也有一个thread:该线程模型的主要作用就行接收和发送数据,所有的IO操作在服务器与客户端的连接建立后,所有的数据的接收和发送都是有该线程模型来负责的,直到客户端与服务器的连接关闭,该线程模型才停止工作。

    3.SocketAcceptor中有多个SocketIoProcessor,SocketIoProcessor的数量是由CPU的核数+1来决定。

IoFilter:

    IoFilter是一个过滤器,但是在mina中它不仅仅就是一个过滤器。功能如下:

(1)记录事件的日志
(2)测量系统性能
(3)信息验证
(4)过载控制
(5)信息的转换 (编码和解码)
(6)和其他更多的信息

    在启动时,各种IoFilter的实现类被加入到FilterChain中,在这里,就是一个责任链模式了。加入的IoFilter实例的顺序,决定了执行的顺序。

public static void main(String[] args) throws IOException {
		SocketAddress address = new InetSocketAddress("localhost", 4321);
		IoAcceptor acceptor = new SocketAcceptor();
		IoServiceConfig config = acceptor.getDefaultConfig();

		// 配置数据的编解码器
		config.getFilterChain().addLast("codec",
				new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
		config.getFilterChain().addLast("logger", new LoggingFilter());

		// 绑定服务器端口
		acceptor.bind(address, new ServerHandler());
	}
执行的顺序如下图:

apache Mina分析小结(1.1.7)_第2张图片

IoFilter的线程池:

    在Mina的API中提供了一个ExecutorFilter,该线程池实现了IoFilter接口,它可以作为一个IoFilter添加到IoFilterChain中,它的作用就是将I/O Processor中的事件通过其自身封装的一个线程池来转发到下一个过滤器中。在没有添加该线程模型时,I/O Processor的事件是通过方法来触发的,然后转发给IoHandler。在没有添加该线程池的时候,所有的事件都是在单线程模式下运行的,也就是说有的事件和处理(IO Processor,IoHandler,IoFilter)都是运行在同一个线程上,这个线程就是IO Processor的线程,但是这个线程的数量受到CPU核数的影响,因此系统的性能也直接受CPU核数的影响。

   在Asyncweb中,采用了OrderedThreadPoolExecutor这个线程池。这个executor是用来处理从网络中来的请求。它的不同之处在于,对于同一个session来的请求,它能够按照请求到达的时间顺序的执行。举个例子,在一个session中,如果先接收到request A,然后再接收到request B,那么,OrderedThreadPoolExecutor能够保证一定处理完A之后再处理B。而一般的thread pool,会将A和B传递给不同的thread处理,很有可能request B会先于request A完成。

IoHandler:

    在IoFilter层,Mina进行了数据接收,编码解码等操作。而IoHandler就是逻辑层了。我们可以继承IoHandlerAdapter,实现自己的IoHandler。IoHandlerAdapter包括几个方法:

 public void sessionCreated(IoSession session)
 public void sessionOpened(IoSession session) 
 public void sessionClosed(IoSession session) 
 public void sessionIdle(IoSession session, IdleStatus status) 
 public void exceptionCaught(IoSession session, Throwable cause) 
 public void messageReceived(IoSession session, Object message)
 public void messageSent(IoSession session, Object message)

    Mina中的类结构图:


SingleSessionIoHandlerDelegate:这是一个服务器和客户端只有一个会话时使用的类,在该类的方法中没有提供session的参数。在Asyncweb中就是使用了这个IoHandler。见《AsyncWeb原理分析(三)——Mina的IoHandler》。

ChainedIoHandler:这个类主要是用于处理IoHandler的messageReceived事件,它和IoHandlerChain配合使用。当在业务逻辑中有多个IoHandler需要处理时,你可以将你的每个IoHandler添加到IoHandlerChain中,这个和过滤器链比较相似。

StreamIoHandler:该类也是用于处理IoHandler的messageReceived事件,它主要用于文件传输的系统中,比如FTP服务器中。

DemuxingIoHandler:该类主要是用于处理多个IoHandler的messageReceived,由于在TCP/IP协议的数据传输中会出现数据的截断现象(由于socket传输的数据包的长度是固定的,当数据包大于该长度,数据包就会被截断),所以提供这个类主要是保证IoHandler所处理的数据包的完整性,这个和编解码器中的CumulativeProtocolDecoder类似。




参考资料:

ChinaEstone—http://chinaestone.iteye.com/category/72082《深入理解ApacheMina 》

historyasamirrorhttp://blog.csdn.net/historyasamirror/article/details/5961368浅谈JAVA ThreadPoolExecutor》


你可能感兴趣的:(apache Mina分析小结(1.1.7))