apache Mina分析小结(1(1)

	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());
}
执行的顺序如下图: 

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201109%2F8%2F0_1315465585mpF8.gif&pos_id=img-XA7W8mKW-1725614002793)  
 


**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中的类结构图:


![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201109%2F8%2F0_13154663805wA3.gif&pos_id=img-Cwtu456v-1725614002794)  
 



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]( )》


historyasamirror**—**[http://blog.csdn.net/historyasamirror/article/details/5961368《]( )[浅谈JAVA ThreadPoolExecutor]( )》  
 


  
 


![img](https://img-blog.csdnimg.cn/img_convert/fcf10bc8ae029c42ad22f0fcc0aaa994.png)
![img](https://img-blog.csdnimg.cn/img_convert/ba676f0789cd99848dbbd153afa2b02c.png)
![img](https://img-blog.csdnimg.cn/img_convert/1b0e3de473ca8a5260c4890242678c0d.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

你可能感兴趣的:(apache)