thomescai http://blog.csdn.net/thomescai(转载请保留)
概要:文本参考自uniseraph的《[mina指南]诡异的IoFilterChain实现》,写的太好了。一为抛砖引玉,二为小结。
(完整JavaOne2008_mina下载地址:http://download.csdn.net/detail/thomescai/3681036)
DefaultIoFilterChain的构建:
当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() );
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示例》