转载:http://www.iteye.com/topic/1124504
二、Mina是怎么实现责任链模式的
上面介绍了纯净的责任链模式,但是在真实的项目中写代码不可能完全照搬,所以多看看开源项目的代码写作方式也许才能真正提高我们的编程能力。就以Mina的过滤器链来看,对这种模式进行了自己的实现,但是道理是相通的,带着责任链模式的理解去看看Mina的实现是怎样的。
先看一下Mina过滤器的类图结构:
从图中我们可以看出Mina对于此模式的实现是相对比较复杂的,其实从它的代码上也可以看出来,当时也是花了好大力气才把它这块看明白,其实主要在于理清思路,抓住核心类,最主要的一个接口IoFilterChain和它的一个内部接口Entry,其中IoFilterChain代表了过滤器的容器,它本身就是一个对象引用形成的链表结构,默认的实现DefaultIoFilterChain其实有对链表头(head)的引用,找到头后就可以顺着头向下找,一直找到尾(tail),Entry是对IoFilter和NextFilter的封装整合接口,它属于链表IoFilterChain中的元素。指向当前和下一个过滤器。
EntryImpl 类中包含两个接口,filter和nextFilter,他们所用的接口是不一样的,至于为什么不用同一个接口,我想可能是因为接口职责单一的原则吧。
虽然有IoFilter和NextFilter两个接口,接口方法都差不多,但最后真正业务的执行者还是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再将消息传递给本Filter的messageReceived方法进行实际的消息接收处理工作:
- 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中的实现,做为一个优秀的框架我们没理由不好好去学习。
每天进步一点点,不做无为的码农。。。。。
相关推荐
在Apache Mina框架中,IoFilter是核心组件之一,用于拦截和过滤I/O操作中的各种信息,可以类比于Servlet中的过滤器。这些过滤器提供了强大的机制来控制数据的传输和处理流程。Apache Mina的IoFilter主要有以下作用:...
- **过滤器体系**:MINA的IoFilter机制允许开发者插入自定义过滤器,实现数据的预处理或后处理,增强了灵活性和可扩展性。 - **异步模型**:MINA基于NIO(非阻塞I/O)实现,提供异步的网络通信,能更好地利用系统...
3. **丰富的API**:MINA提供了一套丰富的API,包括Filter Chain(过滤器链)机制,开发者可以通过添加、移除和定制过滤器来实现数据的预处理和后处理,增强功能或实现协议转换。 4. **可扩展性**:MINA的设计允许...
通过IoSession对象,开发者可以轻松地读写数据,添加过滤器来处理数据流,以及管理网络连接的生命周期。 在实际应用中,Apache MINA常被用在大型分布式系统、在线游戏服务器、聊天服务器、流媒体服务等需要高效处理...
4. **可扩展性**:MINA的模块化设计允许开发者轻松添加新的过滤器或协议处理器,以实现特定的功能需求。 5. **丰富的过滤器链**:MINA中的过滤器链机制允许在数据传输过程中添加自定义处理逻辑,例如数据编码解码、...
3. **过滤器架构**:Mina的过滤器架构是其强大功能的关键。开发者可以创建一系列过滤器,每个过滤器负责处理数据的不同方面,如编码、解码、安全处理等。这种设计使得代码结构清晰,易于维护和扩展。 4. **丰富的...
1. **mina-core-2.0.7.jar**:这是MINA的核心库,包含了网络通信的基本组件和API,如IoSession、IoFilter、IoHandler等,它们用于处理网络连接、数据传输以及过滤器链的管理。 2. **mina-example-2.0.7.jar**:这个...
MINA的过滤器机制使得网络数据的处理变得灵活,可以根据需求添加不同功能的过滤器,如数据编码解码、安全加密等。 在实际开发中,你可能还需要其他的依赖,如特定的序列化库(如Java自带的序列化或protobuf)、...
通过以上步骤,你已经创建了一个基础的Mina TCP服务器,但请注意,实际的网络应用通常会涉及更复杂的场景,如并发连接管理、安全通信(SSL/TLS)、错误处理以及高级过滤器的使用。在Mina框架下,你可以根据需要扩展...
IoFilter 是一种可插拔的组件,允许开发者根据不同的需求动态地添加不同的过滤器。 - **IoHandler**:IoHandler 负责处理实际的应用逻辑。它是 Mina 中的核心组件之一,用来处理由 IoFilter 或 IoProcessor 传递...
通过以上分析可以看出,Mina的IoFilter机制通过`DefaultFilterChainBuilder`构建了一个灵活且高效的过滤器链模型,使得开发者可以方便地添加、管理和扩展过滤器的功能。这种机制不仅提高了网络应用程序的灵活性,还...
深入研究"apache-mina-2.0.4"源码,我们可以学习到MINA如何实现非阻塞I/O,过滤器链的构建和事件传播机制,以及如何定制和扩展MINA以满足特定需求。例如,可以查看IoSession的实现,了解其如何管理会话状态;研究...
- IoFilter是MINA的过滤器机制,它在数据到达IoHandler之前进行预处理,可以看作是数据传输的“管道”中的节点,可以进行多个Filter的链式处理。 - IoHandler则更关注于业务逻辑,它是对网络事件的最终处理者,如...
在数据传输过程中,这些过滤器按顺序执行,从而增强了网络通信的灵活性和安全性。 #### 七、IoHandler业务逻辑 `IoHandler`是处理业务逻辑的关键所在。每当有新的连接请求到达或者现有连接中有数据可读时,Mina...
IoProcessor还会调用注册的IoFilter链,并在过滤器之后调用IoHandler处理业务逻辑。 IoFilter接口定义了一组拦截器,用于实现如日志、黑名单过滤和数据编码解码等功能。数据的编码和解码是使用Mina时最核心的部分,...
IoFilter则是一个过滤器链,允许在数据传输到IoHandler之前对其进行预处理或在之后进行后处理。通过IoFilter,你可以实现认证、加密、压缩等各种功能,增强了MINA的灵活性和可扩展性。 在MINA中,ByteBuffer的使用...
- **关键类和接口**:如IoAcceptor用于监听和接受连接,IoHandler处理网络事件,IoFilter接口定义了过滤器行为,IoSession代表网络连接。 - **配置文件**:可能包含配置服务器端口、线程池大小等信息的XML配置文件。...