锁定老帖子 主题:还是源码来的直接---读mina源码
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-26
最后修改:2009-03-27
多好的文档也不如源码来的直接。如果自己的程序对于某种技术过于依赖,有时候仅看那么几页的文档,总是感觉放心不下。还是看看源码,多多理解内部的实现机制为好。 一 读源码时,首先要弄清楚代码所涉及到的重要模型及其之间的关系,从整体架构方面理解其组成。 1.对于IOService的实现NioSocketConnector和NioSocketAcceptor来说,都持有selector的引用,本身都有一个固定的线程池executor,用来执行Connector或者Acceptor任务。 2.除此之外,IoService还有对Processor池的引用,该池中的元素processor的数量是机器的cpu核数+1。 3.processor池中默认元素为NioProcessor对象,每个元素都有一个selector,而且有一个executor线程池,用来执行Processor任务。 二 分析框架的初始化方式,注意不要陷入技术细节,仍然是整体把握。 4.IoService初始化时,需要通过具体的实现提供的transportMetaData,来判断其中规定的session配置类(例如:DefaultSocketSessionConfig)是否来自接口SessionConfig。 5.IoService初始化时,建立与监听器容器IoServiceListenerSupport的双向关联,注册匿名内部实现serviceActivationListener到监听器容器。 PS:Mina框架比起Tomcat源码来说简单很多,Tomcat启动逻辑就花了很长时间来读。 三 要充分利用eclipse中提供给我们查找源码的方法,例如Ctrl+T,Ctrl+H,Ctrl+.,Alt+Shift+o等等。 四 框架初始化后,根据框架的使用方式,来逐步分析代码。 6.关键是对Session的理解: 持有对IoService,Processor池,SocketChannel,SessionConfig和IoService.IoHandler的引用。 在初始化session时,将config配置到了SocketChannel中。 深入理解: 在每次connect后,都会建立与之对应的session(session与channel是1:1关系),而且每个session都加入了processor中,但是都是持有的对一个IoHandler的引用。 将session加入到processor池: 该processor元素的选取是依次在池中选择的。然后将该processor元素加入到了session的attribute中。 也就是说,不同的session可能加入到池中的一个processor元素,一个processor元素有一个selector和一个Processor线程,该线程可以对processor元素对应的这些session进行处理。 7.Processor线程: (1)如果有newSession,则将channel注册事件SelectionKey.OP_READ到该processor元素的selector (2)将getFilterChainBuilder中的链节点加入到该session的链中 (3)fire相应的SessionCreate和SessionOpen的chain节点 (4)如果SelectionKey.OP_READ准备好,则read数据,如果session对应的发送队列有数据,则write数据 如果建立的session都放在了一个processor元素里,则handler只能够被一个线程访问,否则handler可能会被多个线程执行。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-02-27
关于类加载的设计有待继续学习
|
|
返回顶楼 | |
发表时间:2009-03-20
用mina来实现TCP或者UDP通讯底层好像还是Socket通讯。
|
|
返回顶楼 | |
发表时间:2009-03-20
似乎任何底层上的通信都是SOCKET吧
|
|
返回顶楼 | |
发表时间:2009-03-26
zyihang 写道 用mina来实现TCP或者UDP通讯底层好像还是Socket通讯。 是socket通信,mina利用java的nio来实现io的多路复用。 |
|
返回顶楼 | |
发表时间:2009-03-27
MINA的并发性能好像比较差!
|
|
返回顶楼 | |
发表时间:2009-03-27
lqql 写道 MINA的并发性能好像比较差! 昨天分析了一下,可能和handler的使用情况有关。 |
|
返回顶楼 | |
发表时间:2009-04-02
嗯 , MINA挺好 不过就是因为HANDLER的关系导致MINA和业务剥离的不够明显,建议IO就是IO,IO操作完了(里程碑式操作)直接把IO数据推到业务队列里面 让业务和IO分离.
|
|
返回顶楼 | |
发表时间:2009-05-21
sxjkk 写道 似乎任何底层上的通信都是SOCKET吧
socket指的是有连接的可靠通讯,是一个tcp协议的实现 与之相对应的是udp协议,是没有连接的数据报文通讯,在java当中对应的是DatagramSocket,虽然都叫socket,但是两个东西完全不同。 |
|
返回顶楼 | |
发表时间:2009-05-21
fjlyxx 写道 嗯 , MINA挺好 不过就是因为HANDLER的关系导致MINA和业务剥离的不够明显,建议IO就是IO,IO操作完了(里程碑式操作)直接把IO数据推到业务队列里面 让业务和IO分离.
在mina中你可以自定义filter,在filter中执行byte code<-->java object之间的转化,而仅仅在handler中实现相关的业务逻辑,所以我觉得mina把io工作和业务剥离的已经很不错了。 |
|
返回顶楼 | |