一: IOFilter的作用
LoggingFilter记录所有事件和请求
ProtocolCodecFilter将到来的ByteBuffer转换成消息对象(POJO)
CompressionFilter压缩数据
SSLFilter增加SSL – TLS – StartTLS支持
二: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。
三:已经实现的相关类
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