设为首页 收藏本站
查看: 703|回复: 0

[经验分享] 深入理解Apache Mina (4)---- IoFilter和IoHandler的区别和联系

[复制链接]

尚未签到

发表于 2017-1-14 11:39:50 | 显示全部楼层 |阅读模式
  在《与IoFilter相关的几个类》和《与IoHandler相关的几个类》两篇文档中我们了解了IoFilter和IoHandler的基本用法,以及其相关类的作用和用途。在本文中主要探讨IoFilter和IoHandler的主要区别和联系。
  在上面的两篇文档中都提到了IoFilter和IoHandler都是对服务器或客户端(IoAcceptor/IoConnector)接收到的数据进行处理。在Mina的官方文档《The high-performance protocol construction toolkit》给出了IoFilter和IoHandler在Mina数据传输中的执行顺序,如下图:
DSC0000.jpg

  上图显示了IoService进行数据读写时,各主要组件的执行顺序:
(1)IoService读取数据时个组件的执行顺序是:IoProcessor-->IoFilter-->IoHandler。
(2)IoService发送数据时的执行数顺序:IoHandler-->IoFilter-->IoProcessor。
  IoProcessor是一个处理线程,它的主要作用是根据当前连接的状态的变化(创建会话、开启会话、接收数据、发送数据、发生异常等等),来将数据或事件通知到IoFilter,当IoFilter的相应的方法接收到该状态的变化信息是会对接收到的数据进行处理,处理完毕后会将该事件转发到IoHandler中,有IoHandler完成最终的处理。在这里IoProcessor的主要功能是创建资源(创建/分配线程给IoFilter)和数据转发(转发到IoFilter),IoFilter对数据进行基本的分类(如编解码),IoHandler则负责具体的逻辑实现。也就是说IoFilter对接收到的数据包的具体内容不做处理,而是有IoHandler来对所接收到的数据包进行处理,根据数据包的内容向客户端返回响应的信息。
  我们以《与IoHandler相关的几个类》中KFC售货机的例子来做一个具体的解释,在该例子中,客户端需要想服务器发送查询价格的请求,服务器根据接收到的请求查询物品的价格,然后将该物品的价格返回到客户端。客户端在向服务器发送数据前会有IoFilterr将发送的信息序列化为二进制数据,然后有IoProcess发送出去,简化如下:
  
       IoHandler发送客户端数据-->IoFilter进行序列化-->IoProcessor

  上面是数据的发送过程,当服务器接收到客户端的的请求数据后,先有IoProcessor将该数据转发到IoFilter,IoFilter将对象进行反序列化,反序列化的结果完成后将数据转发到IoHandler中,过程简化如下:
  
 IoProcessor接收客户度端的数据-->IoFilter进行反序列化-->IoHandler根据请求查询价格这样一个完整的数据请求的过程就完成了。
  上面简单介绍了IoFilter和IoHandler在Mina中的作用,前者是数据的转换层,后者是业务层。但是两者在很多地方都有相似之处,为了将两者的区别做更详细的讨论,先给出两者的结构图:
   DSC0001.jpg
  图中的IoFilter比IoHandler中多出的一个最重要的方法就是filterWriter(),该方法会在程序调用session.write()的时候触发,该方法的重要之处就在于它表明了IoFilter和IoHandler的重要区别,即进行IoFilter是数据的收发层,也可以说是一个数据的收发器,而IoHandler则是逻辑层,并不负责数据的收发,如果把IoProcessor说成是底层的数据收发层,则IoFilter则是一个上层的数据收发层。关于IoFilter中on*()的方法的使用和作用请参考帮助文档,这里不再给出具体的解释。
  到此我们就可以明白了IoFilter是一个数据收发和转化的装置,而IoHandler则是一个单一的业务处理装置,你的所有业务逻辑都应该写在这个类中。如果没有在IoService中配置IoFilter,那么在IoHandler中接收到的数据是一个ByteBuffer,你需要在你的IoHandler(业务层)中完成数据的转化,但是这样就破坏了Mina中各个组件层的关系,这样你的程序结构就不在清晰,因此建议在使用Mina时将数据的转化(即二进制与对象之间的转换放在IoFilter层来处理)。在Mina中必须要配置IoHandler,因为Mina中提供的IoService中的bind方法必须要有一个IoHandler,因此IoHandler不能省略。
  到这里对于IoFilter和IoHandler的内容已经讲述完毕,下面的内容是对我在开发中遇到的一些问题的一些总结,顺便也给自己以前的问题写出答案:
(1)IoHandler和IoHandlerCommand的区别和联系。
   IoHandler和IoHandlerCommand是两个接口,在开发中经常遇到的他们两个现类分别是IoHandlerAdpater和IoHandlerChain,IoHandlerAdpater的子类ChainedIoHandler和IoHandlerChain结合使用可以实现多个逻辑功能,IoHandlerChain代表IoHandlerCommand)是业务逻辑的处理单元,而ChainedIoHandler(代表Iohandler)则是处理这些逻辑单元的组件。因此它们的区别是:IoHandler是刀俎,而IoHandlerCommand则是鱼肉。他们的一般用法如下:  


  IoHandlerChain chain = new IoHandlerChain();// 创建逻辑处理组件
chain.addLast("first", new FistCommand);// 添加逻辑组件单元一
chain.addLast("second", new SecondCommand);// 逻辑组件单元二
ChainedIoHandler chained = new ChainedIoHandler(chain);// 创建逻辑组件执行模块
chained.messageReceived(session, message);// 当messageReceived触发该事件
   
  (2)IoFilter和IoHandler可以同时使用吗?
   IoFilter和IoHandler由于分工不同,因此他们需要同时使用,但是这不是绝对的,在Mina
   的IoService中可以不配置IoFilter,但是必须配置IoHandler。但是,这不是提倡的方式,
   因为这破坏的mina的分层结构,因此建议在使用Mina的时候同时使用IoFilter和
   IoHandler。

  (3)IoFilter和IoHandlerCommand/IoHandler的区别和联系。
   这个问题的答案请参考问题(1)和(2)给出的解释。
  (4)IoHandlerAdpater和IoFilterAdpater的区别和联系。
   IoHandlerAdpater和IoFilterAdpater一个是业务逻辑层的监听器,一个数据传输层的监
   听器,他们的区别就是IoHandler和IoFilter的区别,这个在上面已经讨论清楚了,不在
   详细说明。

  (5)IoFilterChainBuilder和ChainedIoHandler的区别和联系。
       关于这个问题的讨论会在后续的文档中给出。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-328326-1-1.html 上篇帖子: 深入理解Apache Mina (3)---- 与IoHandler相关的几个类 下篇帖子: 深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表