`
wslfh2005
  • 浏览: 13021 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

深入解析Apache Mina源码(1)——Mina的过滤器机制实现

阅读更多


1、深入解析Apache Mina源码(1)——Mina的过滤器机制实现

2、深入解析Apache Mina源码(2)——Mina的事件模型

一、责任链模式的本来面目

Mina 中有一个重要的设计模式-责任链模式,它将此模式成功的应用在了它的过滤器链(IoFilterChain)中。开发过J2EE的童鞋们应该对这个模式比较清楚,在Servlet中我们就可以加入Filter的实现,还有Hibernate中也实现了FilterChain。学习怎么实现责任链模式对于我们对开源软件的学习和以后的工作都会有莫大的帮助。

我们知道计算机系统就是接收信息,进行信息处理,信息输出的过程,那么在这个过程中我们加入过滤器有很多好处,消息经过特定功能的多个过滤器进行逐步处理得到所需要的最终信息,让处理过程透明,责任明晰,方便扩展。

责任链模式的定义我也就不说了,网上一大堆,我的理解是可以把它理解成一个有向链表,消息在这个链表中的某个过滤器进行处理然后再传向下个过滤器,在每个过滤器中都可以处理这些消息,也可以不处理。如图:


责任链模式的类图如下:


其实这里面最核心的就是Handler了,它可是是一个接口或者是一个抽象类,它有对自己的一个引用successor,然后有个处理方法HandleRequest()。因为有了对自己的引用successor所以当本对象不能处理的时候可以转向successor.HandleRequest()方法,这样一个“链”就形成了。

你应该挺羡慕富士.康里面生产苹果手机的工人吧,你平时最喜欢的苹果手机就是他们生产出来的,他们一个人就能把苹果手机生产出来吗?不是的,他们是流水线做业的,OK,流水线就可以看做是责任链模式的体现,工人就是链条上的一员,有的工人组装屏幕,有的工人检查手机,有的工人进行手机的包装等,下面我们就以代码的方式实现:

苹果手机类:

package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:20:18
 * @name com.lifanghu.chain.Iphone.java
 * @version 1.0
 */

public class Iphone {

    private String state = "我是一台苹果机器;";

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

}
 

抽象处理接口类:

package com.lifanghu.chain;



/**
 * @author  lifh
 * @mail    wslfh2005@163.com
 * @since   2012-6-12 下午11:23:36
 * @name    com.lifanghu.chain.IWorker.java
 * @version 1.0
 */

public interface IWorker {

    /**
     * 处理方法
     * @param iphone
     * @author lifh
     */
    void handleIphone(Iphone iphone);
    /**
     * 设置下一个处理者
     * @param worker
     * @author lifh
     */
    void setNext(IWorker worker);
}
 

具体处理者:

package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:29:46
 * @name com.lifanghu.chain.Worker1.java
 * @version 1.0
 */

public class Worker1 implements IWorker {

    private IWorker next;

    public void handleIphone(Iphone iphone) {
        iphone.setState(iphone.getState() + "我被装了一个黑色的后盖;");
        if (next != null)
            next.handleIphone(iphone);
    }

    public void setNext(IWorker worker) {
        this.next = worker;

    }

}
package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:34:32
 * @name com.lifanghu.chain.Worker2.java
 * @version 1.0
 */

public class Worker2 implements IWorker {

    private IWorker next;

    public void handleIphone(Iphone iphone) {
        iphone.setState(iphone.getState() + "我被装了一块电池;");
        if (next != null)
            next.handleIphone(iphone);
    }

    public void setNext(IWorker worker) {
        this.next = worker;
    }
}
package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:34:32
 * @name com.lifanghu.chain.Worker3.java
 * @version 1.0
 */

public class Worker3 implements IWorker {

    private IWorker next;

    public void handleIphone(Iphone iphone) {
        iphone.setState(iphone.getState() + "我现在是一台完整的Iphone了。");
        if (next != null)
            next.handleIphone(iphone);
    }

    public void setNext(IWorker worker) {
        this.next = worker;
    }
}
 

客户端调用者:

package com.lifanghu.chain;

/**
 * @author lifh
 * @mail wslfh2005@163.com
 * @since 2012-6-12 下午11:37:27
 * @name com.lifanghu.chain.Client.java
 * @version 1.0
 */

public class Client {

    public static void main(String[] args) {
        IWorker worker1 = new Worker1();
        IWorker worker2 = new Worker2();
        IWorker worker3 = new Worker3();

        worker1.setNext(worker2);
        worker2.setNext(worker3);
        Iphone iphone = new Iphone();
        worker1.handleIphone(iphone);

        System.out.println(iphone.getState());
    }
}
 

输出结果:

 

 写道
我是一台苹果机器;我被装了一个黑色的后盖;我被装了一块电池;我现在是一台完整的Iphone了。
 

 

好了,现在一台苹果就组装完成了,发现了没有,我们的代码比较整洁清新,没有大量的if/else语句,责任清晰明了,调用简单,想要扩展的话只需要再实现IWorker接口即可,这就是使用责任链模式的好处。

二、Mina是怎么实现责任链模式的

上面介绍了纯净的责任链模式,但是在真实的项目中写代码不可能完全照搬,所以多看看开源项目的代码写作方式也许才能真正提高我们的编程能力。就以Mina的过滤器链来看,对这种模式进行了自己的实现,但是道理是相通的,带着责任链模式的理解去看看Mina的实现是怎样的。

先看一下Mina过滤器的类图结构:


从图中我们可以看出Mina对于此模式的实现是相对比较复杂的,其实从它的代码上也可以看出来,当时也是花了好大力气才把它这块看明白,其实主要在于理清思路,抓住核心类,最主要的一个接口IoFilterChain和它的一个内部接口Entry,其中IoFilterChain代表了过滤器的容器,它本身就是一个对象引用形成的链表结构,默认的实现DefaultIoFilterChain其实有对链表头(head)的引用,找到头后就可以顺着头向下找,一直找到尾(tail),Entry是对IoFilterNextFilter的封装整合接口,它属于链表IoFilterChain中的元素。指向当前和下一个过滤器。


EntryImpl 类中包含两个接口,filternextFilter,他们所用的接口是不一样的,至于为什么不用同一个接口,我想可能是因为接口职责单一的原则吧。


 

 

虽然有IoFilterNextFilter两个接口,接口方法都差不多,但最后真正业务的执行者还是IoFilter的实现,IoFilterAdapter做为它的默认实现,完成了适配器的功能,以后的类可以直接继承它而不用实现IoFilter接口,想实现哪个方法只需要覆盖IoFilterAdapter的类的方法即可。NextFilter只起到转发的作用,如消息接收处理方法(messageReceived):

NextFilter的实现:

//消息接收到以后NextFilter的实现会把消息传递给nextEntry去处理。
public void messageReceived(IoSession session, Object message) {
    Entry nextEntry = EntryImpl.this.nextEntry;
    callNextMessageReceived(nextEntry, session, message);
}
 

DefaultIoFilterChain再将消息传递给本FiltermessageReceived方法进行实际的消息接收处理工作:

private void callNextMessageReceived(Entry entry, IoSession session,
        Object message) {
    try {
        IoFilter filter = entry.getFilter();
        NextFilter nextFilter = entry.getNextFilter();
        //本过滤器进行数据处理,完成后再把消息传向下个过滤器
        filter.messageReceived(nextFilter, session,
                message);
    } catch (Throwable e) {
        fireExceptionCaught(e);
    }
}
 

 

当消息处理完成以后,消息就要进入到业务处理IoHandler的实现类中去完成业务的相关操作了。这可以在链尾看到相关业务传递:

@Override
public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
    AbstractIoSession s = (AbstractIoSession) session;
    if (!(message instanceof IoBuffer)) {
        s.increaseReadMessages(System.currentTimeMillis());
    } else if (!((IoBuffer) message).hasRemaining()) {
        s.increaseReadMessages(System.currentTimeMillis());
    }

    try {
        // 最后一个filter会进入到handler进行消息处理。
        session.getHandler().messageReceived(s, message);
    } finally {
        if (s.getConfig().isUseReadOperation()) {
            s.offerReadFuture(message);
        }
    }
}
 

 

至此,Mina的链表结构就基本讲完了,其实仔细看看它的代码还是比较容易理解的,可能里面有些细节还需要我们去琢磨。

链表建立了以后,外界是怎样调用的呢?

org.apache.mina.core.filterchain包下我们可以看到类IoFilterEvent,可以看到它实现了基于事件的处理模型,当一个事件(比如接收到消息)发生后会触发相应的事件,进而调用过滤器链的消息处理功能进行消息的处理和转发,这块其实会有线程池的参与完成,会在以后的文章中说明这块。

 

 

public void fire() {
    IoSession session = getSession();
    NextFilter nextFilter = getNextFilter();
    IoEventType type = getType();

    if (DEBUG) {
        LOGGER.debug( "Firing a {} event for session {}",type, session.getId() );
    }

    switch (type) {
    case MESSAGE_RECEIVED:
        //触发消息接收
        Object parameter = getParameter();
        nextFilter.messageReceived(session, parameter);
        break;
 

 

当然也可以直接调用:

 

//触发过滤器的接收消息处理
session.getFilterChain().fireMessageReceived(newBuf);

 

 

 还有一个类DefaultIoFilterChainBuilder,它以用户更易用的角度完成了对过滤器链的封装操作,这里就不细讲了。

总结:本文章主要讲了责任链模式在Mina中的实现,做为一个优秀的框架我们没理由不好好去学习。

每天进步一点点,不做无为的码农。。。。。

2012613日星期三

码农虎虎

http://weibo.com/hurtigf

 

http://www.lifanghu.com/

wslfh2005@163.com

1
1
分享到:
评论

相关推荐

    apache-mina源码

    在这个"apache-mina源码"中,我们可以深入理解MINA的设计原理和实现细节。 MINA的核心概念包括: 1. **IoSession**:IoSession是MINA中的核心组件,代表了服务端和客户端之间的连接。它包含了会话的状态信息,如...

    apache-mina-2.0.4.rar_apache mina_mina

    通过分析源码,你可以了解到Mina如何实现非阻塞I/O、如何调度任务、如何组织过滤器链,以及如何处理各种网络事件。这对于优化和重构Mina代码以提升性能将非常有帮助。 对于希望提高网络应用性能或熟悉Java NIO编程...

    mina 源码

    深入研究"apache-mina-2.0.4"源码,我们可以学习到MINA如何实现非阻塞I/O,过滤器链的构建和事件传播机制,以及如何定制和扩展MINA以满足特定需求。例如,可以查看IoSession的实现,了解其如何管理会话状态;研究...

    Mina源码解析

    1. **Mina的过滤器机制实现**: Mina的核心设计理念之一是过滤器链(Filter Chain),它借鉴了Servlet的过滤器模型。每个过滤器都可以在数据传输过程中进行拦截和处理,如数据编码、解码、安全检查等。过滤器之间...

    Apache Mina 入门Demo

    3. **Filter链机制**:Mina采用了过滤器链设计模式,允许你在数据传输过程中添加多个处理阶段。每个过滤器都可以对数据进行预处理或后处理,提高了代码的可复用性和可扩展性。 4. **协议编码和解码**:Mina提供了...

    深入理解Apache_Mina

    在深入探讨Apache Mina框架之前,先要明白它在当今IT行业中的应用背景和重要性。Apache Mina是一个网络应用框架,用于帮助开发高性能和高可扩展性的网络应用。Mina为网络编程提供了一套简洁的API,简化了事件驱动...

    apache-mina-2.0.7架包与源码

    4. **过滤器链**:MINA的过滤器机制允许开发者通过定义和串联一系列处理单元(过滤器)来构建复杂的网络应用逻辑,每个过滤器可以对数据进行读写、转换或者日志记录等操作。 5. **高性能**:MINA的设计目标是高性能...

    Apache Mina Server 2.0 抢鲜体验

    7. **源码分析**:由于标签中提到了“源码”,因此,对于有志于深入理解Mina工作原理的开发者来说,阅读和分析Apache Mina的源码可以帮助他们更好地优化自己的网络应用程序,提高性能和稳定性。 8. **性能优化**:...

    MINA 协议解码过滤器

    在`mina src`压缩包中,可能包含MINA框架的源代码,你可以通过阅读这些源码来深入理解MINA的工作原理,特别是过滤器和解码器的实现。这对于学习MINA、理解和定制自己的网络服务非常有帮助。同时,结合提供的博客链接...

    Mina 1.1.7 示例源码(apache.mina.example)

    这个示例集合是为了学习和交流而准备的,开发者可以通过分析源码了解Mina如何处理网络通信,如何构建过滤器链,以及如何实现自定义的协议编码解码器。同时,这些示例也提供了实际操作的机会,便于开发者在遇到问题...

    MINA源码与例子

    通过阅读源码,你可以深入了解MINA的设计思想和实现细节,例如如何实现非阻塞I/O、过滤器链的工作原理、以及如何自定义协议编码解码器等。 学习MINA源码可以帮助你: 1. **理解网络编程**:MINA是基于Java NIO实现...

    apache下的mina框架的源码

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展且高性能的网络应用程序...通过深入研究MINA源码,开发者可以提升网络编程技能,为构建高效、可伸缩的网络应用打下坚实基础。

    Mina 2.0快速入门与源码解析

    在 Mina 2.0 中,FilterChain 是一种非常重要的机制,它允许开发者插入一系列过滤器来处理入站和出站的数据流。这些过滤器可以用来执行日志记录、编解码、压缩等多种功能。 **2.3 ProtocolCodecFilter** `...

    apache-mina-2.0.7-src.zip

    通过研究这个源代码,开发者可以学习到MINA如何实现非阻塞I/O,如何利用事件驱动模型提高性能,以及如何通过过滤器链处理网络数据。同时,源码也是理解网络编程和协议处理的一个宝贵资源,对于提升Java网络应用开发...

    深入理解Apache Mina (2)---- 与IoFilter相关的几个类

    在Apache Mina框架中,IoFilter是核心组件之一,用于拦截和过滤I/O操作中的各种信息,可以类比于Servlet中的过滤器。这些过滤器提供了强大的机制来控制数据的传输和处理流程。Apache Mina的IoFilter主要有以下作用:...

    Mina2源码分析

    ### Mina2源码分析——核心模块解析 #### 概述 Mina2是一个高性能、可扩展的网络应用框架,支持多种传输协议如TCP、UDP等,并提供了丰富的API供开发者使用。本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和...

    Apache MINA 2.0.0-M1

    3. **过滤器架构**:MINA的过滤器架构允许开发者插入自定义的过滤器来处理数据,如编码解码、安全加密、日志记录等。过滤器之间可以通过链式调用来处理进/出站数据,提供灵活的数据处理流程。 4. **丰富的API**:...

    ApacheMina入门(完成版)

    2. **Filter Chain**:过滤器链是Mina处理网络通信的一种机制。每个过滤器执行特定的任务,如数据编码解码、安全处理等,数据在发送到目标或从源头接收时会经过这些过滤器。 3. **Service**:服务是处理客户端请求的...

Global site tag (gtag.js) - Google Analytics