首页 > OOP语言 > 其它 > 正文

使用 Apache MINA 2 开发网络应用
2012-03-28 00:00:00   来源:www.bianceng.cn   评论:0 点击:

暂时无描述信息

I/O 过滤器

从 I/O 服务发送过来的所有 I/O 事件和请求,在到达 I/O 处理器之前,会先由 I/O 过滤器链中的 I/O 过滤器进行处理。Apache MINA 中的过滤器与 Servlet 规范中的过滤器是类似的。过滤器可以在很多情况下使用,比如记录日志、性能分析、访问控制、负载均衡和消息转换等。过滤器非常适合满足网络应用中各种横切的非功能性需求。在一个基于 Apache MINA 的网络应用中,一般存在多个过滤器。这些过滤器互相串联,形成链条,称为过滤器链。每个过滤器依次对传入的 I/O 事件进行处理。当前过滤器完成处理之后,由过滤器链中的下一个过滤器继续处理。当前过滤器也可以不调用下一个过滤器,而提前结束,这样 I/O 事件就不会继续往后传递。比如负责用户认证的过滤器,如果遇到未认证的对等体发出的 I/O 事件,则会直接关闭连接。这可以保证这些事件不会通过此过滤器到达 I/O 处理器。

Apache MINA 中 I/O 过滤器都实现 org.apache.mina.core.filterchain.IoFilter接口。一般来说,不需要完整实现 IOFilter接口,只需要继承 Apache MINA 提供的适配器 org.apache.mina.core.filterchain.IoFilterAdapter,并覆写所需的事件过滤方法即可,其它方法的默认实现是不做任何处理,而直接把事件转发到下一个过滤器。

IoFilter 接口详细说明

IoFilter接口提供了 15 个方法。这 15 个方法大致分成两类,一类是与过滤器的生命周期相关的,另外一类是用来过滤 I/O 事件的。第一类方法如 表 3 所示。

表 3. IoFilter 中与过滤器的生命周期相关的方法

方法 说明
init() 当过滤器第一次被添加到过滤器链中的时候,此方法被调用。用来完成过滤器的初始化工作。
onPreAdd(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 当过滤器即将被添加到过滤器链中的时候,此方法被调用。
onPostAdd(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 当过滤器已经被添加到过滤器链中之后,此方法被调用。
onPreRemove(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 当过滤器即将被从过滤器链中删除的时候,此方法被调用。
onPostRemove(IoFilterChain parent, String name, IoFilter.NextFilter nextFilter) 当过滤器已经被从过滤器链中删除的时候,此方法被调用。
destroy() 当过滤器不再需要的时候,它将被销毁,此方法被调用。

在 表 3 中给出的方法中,参数 parent 表示包含此过滤器的过滤器链,参数 name 表示过滤器的名称,参数 nextFilter 表示过滤器链中的下一个过滤器。

第二类方法如 表 4 所示。

表 4. IoFilter 中过滤 I/O 事件的方法

方法 说明
filterClose(IoFilter.NextFilter nextFilter, IoSession session) 过滤对 IoSession的 close方法的调用。
filterWrite(IoFilter.NextFilter nextFilter, IoSession session, WriteRequest writeRequest) 过滤对 IoSession的 write方法的调用。
exceptionCaught(IoFilter.NextFilter nextFilter, IoSession session, Throwable cause) 过滤对 IoHandler的 exceptionCaught方法的调用。
messageReceived(IoFilter.NextFilter nextFilter, IoSession session, Object message) 过滤对 IoHandler的 messageReceived方法的调用。
messageSent(IoFilter.NextFilter nextFilter, IoSession session, WriteRequest writeRequest) 过滤对 IoHandler的 messageSent方法的调用。
sessionClosed(IoFilter.NextFilter nextFilter, IoSession session) 过滤对 IoHandler的 sessionClosed方法的调用。
sessionCreated(IoFilter.NextFilter nextFilter, IoSession session) 过滤对 IoHandler的 sessionCreated方法的调用。
sessionIdle(IoFilter.NextFilter nextFilter, IoSession session, IdleStatus status) 过滤对 IoHandler的 sessionIdle方法的调用。
sessionOpened(IoFilter.NextFilter nextFilter, IoSession session) 过滤对 IoHandler的 sessionOpened方法的调用。

对于 表 4 中给出的与 I/O 事件相关的方法,它们都有一个参数是 nextFilter,表示过滤器链中的下一个过滤器。如果当前过滤器完成处理之后,可以通过调用 nextFilter 中的方法,把 I/O 事件传递到下一个过滤器。如果当前过滤器不调用 nextFilter 中的方法的话,该 I/O 事件就不能继续往后传递。另外一个共同的参数是 session,用来表示当前的 I/O 会话,可以用来发送消息给对等体。下面通过具体的实例来说明过滤器的实现。

相关热词搜索:

上一篇:使用Blueprint Container规范构建OSGi应用程序
下一篇:结合使用 Apache Geronimo 和 Lift

分享到: 收藏