(ps:写完后觉着第一博还是应该说一下Mina的简介,就附上了0部分吧)
0. Mina框架简介
MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。
MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。
1. 引言
近期的项目需要用到Mina,比较粗浅的在上层简单的搭建自己的项目,但是有种非常疑惑并且没有安全感的想法,就决定看下Mina的源码,并且网络部分的知识还是很重要的。第一次写源码分析的博客,也没有经验,不知道怎么说好,是不是需要细致摄入。我就避开入门和介绍部分,直接分析源码了,可能比较细微一点,也留作自己日后查看。(ps:如果要找Mina的介绍、入门相关的博客在iteye一搜就会有很多相关的介绍的,可以先看一下整体框架和基本的使用方法,方便理解)
直接看源码可能会有找不到头绪的事情,站在巨人的肩膀上还是很好的方法,我选择了这个博客,先给出作者的地址,我会首先按照作者的思路分成四部分介绍,如果需要补充在增加文章,还是很推荐这几篇文章,有些作者说的清楚的我就不再重复描述,但是对于有些说的不清楚,或UML图有问题的我会说明一下,做少量的引用。
http://wslfh2005.iteye.com/ 作者有四篇文章,不再详细列出,
如果查看了Mina的入门博客,或者官方文档肯定对于类似下面这个图比较熟悉了,可以很清楚的看到IoFileterChain的过滤层,Mina对三层进行了很好的分离,使得连接维护,信息的预处理,逻辑处理很好的分离。我们首先来单个模块剥离,按照推荐的博客的顺序首先介绍过滤器层。
2.Mina过滤器机制的实现
Mina的核心代码都在core中,包结构也很清晰,此部分代码都在core.filterchain中,目录下有一下几个类:
最重要的基础类和接口是:IoFilter、IoFilterChain、DefaultIoFilterChain。
这个图和引用的博客的图都不能很好的看出来这些文件的直接关系,下面就先看一下,有个直观认识
2.1 IoFilter
看一下IoFilter定义的方法,可以把IoFilter简单的分成两部分。
一部分是跟IoFilterChain相关的,在添加、删除相应的Filter之后调用,如:
- /**
- * Invoked before this filter is added to the specified <tt>parent</tt>.
- * Please note that this method can be invoked more than once if
- * this filter is added to more than one parents. This method is not
- * invoked before {@link #init()} is invoked.
- *
- * @param parent the parent who called this method
- * @param name the name assigned to this filter
- * @param nextFilter the {@link NextFilter} for this filter. You can reuse
- * this object until this filter is removed from the chain.
- */
- void onPreAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception;
/** * Invoked before this filter is added to the specified <tt>parent</tt>. * Please note that this method can be invoked more than once if * this filter is added to more than one parents. This method is not * invoked before {@link #init()} is invoked. * * @param parent the parent who called this method * @param name the name assigned to this filter * @param nextFilter the {@link NextFilter} for this filter. You can reuse * this object until this filter is removed from the chain. */ void onPreAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception;