Mina IOFilter

 

 

一: IOFilter的作用

      LoggingFilter记录所有事件和请求

      ProtocolCodecFilter将到来的ByteBuffer转换成消息对象(POJO)

      CompressionFilter压缩数据

      SSLFilter增加SSL – TLS – StartTLS支持

 

二:IOFilter的类图和常用方法

       Mina_IoFilter

 

    IoFilter是MINA中的过滤器接口

       6个与IoFilter生命周期相关的方法;

       2个与IoSession请求相关的方法;

       7个与IoHandler事件相关的方法;

  

   

IoFilter生命周期事件

   

  

   

 

IoFilter与IoSession的请求

IoFilter有2个与IoSession接口相关的请求方法。当IoSession发出这两个请求后,将委托IoFilterChain来执行,实际上是由IoFilterChain容器中的一系列IoFilter来处理。

 

void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception; 当调用IoSession.write(Object)方法时,IoFilterChain中的过滤器将逐个被执行。

void filterClose( NextFilter nextFilter, IoSession session) throws Exception; 当调用 IoSession.close()方法时, IoFilterChain中的过滤器将逐个被执行。

IoFilter与ReferenceCountingFilter

ReferenceCountingFilter之所以称之为引用计数过滤器,是因为IoFilterChain容器内部维护的是Entry对象节点,当同一个IoFilter对象被多次添加到IoFilterChain中,IoFilterChain会创建一个新的Entry对象来封装它的,即同一个IoFilter对象可以在IoFilterChain内部被多个不同的Entry所引用。而ReferenceCountingFilter可以用来跟踪那些被多次添加到IoFilterChain容器的IoFilter对象。

 

• 什么时候会触发IoFilter的初始化方法init

同一个IoFilter对象可以被多次添加到IoFilterChain容器中,而IoFilter接口提供了init方法为过滤器做初始化操作,从程序业务逻辑的角度来说,同一个IoFilter对象即便被多次添加到IoFilterChain容器时应当仅仅初始化一次(当然这不是绝对的,这取决与框架的开发者的设计思路,显然MINA框架的设计者是这样认为的)。

 

当被ReferenceCountingFilter对象将要添加到IoFilterChain容器前,ReferenceCountingFilter的onPreAdd方法会先检测其中的引用计数字段count,当count为0时表示被包装的IoFilter对象还没有添加到IoFilterChain容器中,ReferenceCountingFilter的onPreAdd方法此时会先调用被包装的IoFilter对象的初始化方法init,再调用被包装的IoFilter对象的预添加方法,之后会令count字段自增,表示IoFilter对象已经被添加IoFilterChain容器中一次了。当被ReferenceCountingFilter对象再次添加到IoFilterChain容器,count字段会继续自增,用来表示被装饰的IoFilter对象添加的次数。

 

需要注意的是,当ReferenceCountingFilter对象从IoFilterChain容器中彻底移除后(即添加了多少次,同样需要移除多少次,直到count字段恢复为0),并再次添加到IoFilterChain容器时,由ReferenceCountingFilter所包装的IoFilter对象会重新初始化。

 

• 什么时候会触发IoFilter的释放方法destroy

由ReferenceCountingFilter的初始化策略可以得知,当ReferenceCountingFilter对象被多次添加到IoFilterChain容器,那么也需要执行同样次数的移除操作才能将其彻底从IoFilterChain容器中清除(实际是将IoFilterChain中Entry对象所引用的IoFilter移除)。

如代码清单所示,当ReferenceCountingFilter对象从IoFilterChain容器中移除时,ReferenceCountingFilter的onPostRemove方法会先调用被包装的IoFilter对象的onPostRemove方法,之后再令引用字段count自减,表示IoFilter对象的引用已经从IoFilterChain容器中移除一次。直到count字段恢复为0时才会调用ReferenceCountingFilter所包装的IoFilter对象的释放方法destroy。

三:已经实现的相关类

    

Filter class Description
Blacklist BlacklistFilter Blocks connections from blacklisted remote addresses
Buffered Write BufferedWriteFilter Buffers outgoing requests like the BufferedOutputStream does
Compression CompressionFilter  
ConnectionThrottle ConnectionThrottleFilter  
ErrorGenerating ErrorGeneratingFilter  
Executor ExecutorFilter  
FileRegionWrite FileRegionWriteFilter  
KeepAlive KeepAliveFilter  
Logging LoggingFilter Logs event messages, like MessageReceived, MessageSent, SessionOpened, ...
MDC Injection MdcInjectionFilter Inject key IoSession properties into the MDC
Noop NoopFilter A filter that does nothing. Useful for tests.
Profiler ProfilerTimerFilter Profile event messages, like MessageReceived, MessageSent, SessionOpened, ...
ProtocolCodec ProtocolCodecFilter A filter in charge of encoding and decoding messages
Proxy ProxyFilter  
Reference counting ReferenceCountingFilter Keeps track of the number of usages of this filter
RequestResponse RequestResponseFilter  
SessionAttributeInitializing SessionAttributeInitializingFilter  
StreamWrite StreamWriteFilter  
SslFilter SslFilter  
WriteRequest WriteRequestFilter  

 

From https://yanglu.gitbooks.io/mina/content/minazhong_de_guo_lv_qi_lei.html

 

 

猜你喜欢

转载自labreeze.iteye.com/blog/2246425