Mina2.0(IoFilterChain的实现)——抛砖引玉

 thomescai http://blog.csdn.net/thomescai(转载请保留)

概要:文本参考自uniseraph的《[mina指南]诡异的IoFilterChain实现》,写的太好了。一为抛砖引玉,二为小结。



(完整JavaOne2008_mina下载地址:http://download.csdn.net/detail/thomescai/3681036)

DefaultIoFilterChain的构建:

Mina2.0(IoFilterChain的实现)——抛砖引玉_第1张图片

    当session建立之后,会执行session.getService().getFilterChainBuilder().buildFilterChain(session.getFilterChain());

DefaultIoFilterChainBuilder的实现接口方法buildFilterChain()如下:

public void buildFilterChain(IoFilterChain chain) throws Exception {
	for (IoFilterChain.Entry e : this.entries)
		chain.addLast(e.getName(), e.getFilter());
	}
}

    DefaultIoFilterChainBuilder中的FilterChain列表entries全都加载到了Session中。


IoFilterChain初始化的典型代码:

IoAcceptor acceptor = new NioSocketAcceptor();  
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));  
acceptor.setHandler(  new TimeServerHandler() );  


初始化以后的结构图为:
Mina2.0(IoFilterChain的实现)——抛砖引玉_第2张图片

     TimeServerHandler是什么时候被调用的?请看TailFilter的代码:

private static class TailFilter extends IoFilterAdapter {
		public void sessionCreated(IoFilter.NextFilter nextFilter,
				IoSession session) throws Exception {
			session.getHandler().sessionCreated(session);
		}
		public void sessionOpened(IoFilter.NextFilter nextFilter,
				IoSession session) throws Exception {
			session.getHandler().sessionOpened(session);
		}
		public void sessionClosed(IoFilter.NextFilter nextFilter,
				IoSession session) throws Exception {
			AbstractIoSession s = (AbstractIoSession) session;
			try {
				s.getHandler().sessionClosed(session);
			} finally {

			}
		}
	}
    TailFilter继承IoFilterAdapter是Filter的最后一个节点,TimeServerHandler继承IoHandlerAdapter,两个接口有相同的方法:sessionCreated(),sessionOpened()。Handler中的方法就是在这里被调用的。 


PS:Filter是一种责任链模式,mina的Filter是一个双向链表。简化版本可以参考:《仿mina filter示例》




参考资料:

uniseraph:http://uniseraph.iteye.com/blog/228194《[mina指南]诡异的IoFilterChain实现》

east_java:http://japi.iteye.com/blog/605260《仿mina filter示例》


你可能感兴趣的:(Mina)