cindy源码分析filterchain

 常用的网络通讯框架主要有:Mina ,Grizzly,Cindy,Netty 等,看了下cindy的代码,和mina有很多相似的地方,实现的比mina精简很多,据说性能还要好于mina.参照代码实现了一下 filterchain的HelloWorld版,简单说明一下cindy里对filterchain模式的应用.

首先定义filter接口,filter接口封装了session中的sessionStarted,sessionClosed,messageReceived等方法,为了简单,我只模拟一个send方法,用一个String的消息代替session对象

Java代码
  1. public   interface  Filter {  
  2. void  send(FilterChain chain, String msg);  
  3. }  
    public interface Filter {
	   void send(FilterChain chain, String msg);
    }



FilterChain是filter的一个管理容器,在cindy里filterChain管理2种filter,第一种是系统内部的filter,另外一种是用户定义的filter,看一下FilterChain的定义

Java代码
  1. public   interface  FilterChain {  
  2.   
  3.     public   void  addFilter(Filter filter);  
  4.   
  5.     public   void  send(String msg);  
  6. }  
public interface FilterChain {

	public void addFilter(Filter filter);

	public void send(String msg);
}


为了简单,我只定义了addFilter,而没有定义removeFilter方法,send方法其实是filterChain调用所管理的所有filter的一个方法,看一个具体实现

Java代码
  1. public   abstract   class  AbstractFilterChain  implements  FilterChain {  
  2.     protected   static   final  Filter NULL_FILTER =  new  NullFilter();  
  3.     protected   static   final  Filter DISPACHER_FILTER =  new  FirstInnerFilter();  
  4.   
  5.     protected   abstract  Filter nextFilter();  
  6.   
  7.     public  Filter next() {  
  8.         Filter filter = nextFilter();  
  9.         return  filter !=  null  ? filter : NULL_FILTER;  
  10.     }  
  11.   
  12.     @Override   
  13.     public   void  send(String msg) {  
  14.         next().send(this , msg);  
  15.     }  
  16.   
  17. }  
public abstract class AbstractFilterChain implements FilterChain {
	protected static final Filter NULL_FILTER = new NullFilter();
	protected static final Filter DISPACHER_FILTER = new FirstInnerFilter();

	protected abstract Filter nextFilter();

	public Filter next() {
		Filter filter = nextFilter();
		return filter != null ? filter : NULL_FILTER;
	}

	@Override
	public void send(String msg) {
		next().send(this, msg);
	}

}


在这个抽象类里,我们基本可以看出filterChain是如何管理所有filter的,首先filterChain里定义了2个系统内部的 filter,FirstInnerFilter是filterChain里的第一个filter,在cindy里的名称是 DispacherFilter,里面是通过一个线程池DefaultDispacher调用所有的filter的,NullFilter是系统的最后一 个filter,当然我的实现是非常简单的,cindy实际上定义了很多个系统内部的filter,其中还有一个PacketDecoderFilter 用于解码的filter,主要处理字节流转换成java对象,类似netty 里的MessageReconizer

每次调用send,方法,都会通过nextFilter取得下一个filter进行调用,看一下最终实现

Java代码
  1. public   class  DefaultFilterChain  extends  AbstractFilterChain {  
  2.     private  Filter[] appFilters =  new  Filter[ 0 ];  
  3.     private  Filter dispacherFilter = DISPACHER_FILTER;  
  4.     private   int  cursor = - 1 ;  
  5.   
  6.     @Override   
  7.     public   void  addFilter(Filter filter) {  
  8.         Filter[] newFilters = new  Filter[appFilters.length +  1 ];  
  9.         if  (appFilters.length >  0 ) {  
  10.             System.arraycopy(appFilters, 0 , newFilters,  0 , appFilters.length);  
  11.         }  
  12.         newFilters[appFilters.length] = filter;  
  13.         appFilters = newFilters;  
  14.     }  
  15.   
  16.     @Override   
  17.     protected  Filter nextFilter() {  
  18.         Filter filter = null ;  
  19.         if  (dispacherFilter !=  null ) {  
  20.             filter = dispacherFilter;  
  21.             dispacherFilter = null ;  
  22.         } else   if  (++cursor < appFilters.length) {  
  23.             filter = appFilters[cursor];  
  24.         } else  {  
  25.             filter = NULL_FILTER;  
  26.         }  
  27.         return  filter;  
  28.     }  
  29. }  
public class DefaultFilterChain extends AbstractFilterChain {
	private Filter[] appFilters = new Filter[0];
	private Filter dispacherFilter = DISPACHER_FILTER;
	private int cursor = -1;

	@Override
	public void addFilter(Filter filter) {
		Filter[] newFilters = new Filter[appFilters.length + 1];
		if (appFilters.length > 0) {
			System.arraycopy(appFilters, 0, newFilters, 0, appFilters.length);
		}
		newFilters[appFilters.length] = filter;
		appFilters = newFilters;
	}

	@Override
	protected Filter nextFilter() {
		Filter filter = null;
		if (dispacherFilter != null) {
			filter = dispacherFilter;
			dispacherFilter = null;
		} else if (++cursor < appFilters.length) {
			filter = appFilters[cursor];
		} else {
			filter = NULL_FILTER;
		}
		return filter;
	}
}



addFilter比较好理解用于向chain容器内添加用户定义的filter
nextFilter是整个chain的调度中心,流程是:
首先调用系统内部的FirstInnerFilter,然后开始循环调用所有用户自定义的filter,最后是
系统内部的NullFilter,我们再看看各种filter的实现

Java代码
  1.     public   class  FirstInnerFilter  implements  Filter {  
  2.   
  3.     @Override   
  4.     public   void  send(FilterChain chain, String msg) {  
  5.         System.out.println("first inner filter(Dispacher Filter): "  + msg);  
  6.         chain.send(msg);  
  7.     }  
  8.   
  9. }  
   public class FirstInnerFilter implements Filter {

	@Override
	public void send(FilterChain chain, String msg) {
		System.out.println("first inner filter(Dispacher Filter): " + msg);
		chain.send(msg);
	}

}



FirstInnerFilter是容器里首个被调用的filter,在调用方法里,通过chain.send(msg),其实就是调用 FilterChain的 next().send(msg)方法,依此类推,遍历容器内所有的filter,下面是其他的实现:

Java代码
  1. public   class  NullFilter  implements  Filter {  
  2.   
  3.     @Override   
  4.     public   void  send(FilterChain chain, String msg) {  
  5.         System.out.println("the final of the chain, NullFilter: "  + msg);  
  6.     }  
  7.   
  8. }  
public class NullFilter implements Filter {

	@Override
	public void send(FilterChain chain, String msg) {
		System.out.println("the final of the chain, NullFilter: " + msg);
	}

}


Java代码
  1. public   class  FilterAdapter  implements  Filter {  
  2.   
  3.     @Override   
  4.     public   void  send(FilterChain chain, String msg) {  
  5.         chain.send(msg);  
  6.     }  
  7.   
  8. }  
public class FilterAdapter implements Filter {

	@Override
	public void send(FilterChain chain, String msg) {
		chain.send(msg);
	}

}



所有的用户定义的filter继承自FilterAdapter,其实也可以不必这样的,可以直接在应用filter里调用chain.send(msg);

以下是两个用户自定义的filter示例

Java代码
  1. public   class  AppFilterA  extends  FilterAdapter {  
  2.   
  3.     @Override   
  4.     public   void  send(FilterChain chain, String msg) {  
  5.         System.out.println("AppFilterA: "  + msg);  
  6.         super .send(chain, msg);  
  7.     }  
  8.   
  9. }  
public class AppFilterA extends FilterAdapter {

	@Override
	public void send(FilterChain chain, String msg) {
		System.out.println("AppFilterA: " + msg);
		super.send(chain, msg);
	}

}


Java代码
  1. public   class  AppFilterB  extends  FilterAdapter {  
  2.   
  3.     @Override   
  4.     public   void  send(FilterChain chain, String msg) {  
  5.         System.out.println("AppFilterB: "  + msg);  
  6.         super .send(chain, msg);  
  7.     }  
  8.   
  9. }  
public class AppFilterB extends FilterAdapter {

	@Override
	public void send(FilterChain chain, String msg) {
		System.out.println("AppFilterB: " + msg);
		super.send(chain, msg);
	}

}



最后看一下测试代码:

Java代码
  1. public   class  TestChain {  
  2.     public   void  send(String msg) {  
  3.         DefaultFilterChain chain = new  DefaultFilterChain();  
  4.         chain.addFilter(new  AppFilterA());  
  5.         chain.addFilter(new  AppFilterB());  
  6.         chain.send(msg);  
  7.     }  
  8.   
  9.     public   static   void  main(String[] args) {  
  10.         new  TestChain().send( "test msg" );  
  11.     }  
  12. }  
public class TestChain {
	public void send(String msg) {
		DefaultFilterChain chain = new DefaultFilterChain();
		chain.addFilter(new AppFilterA());
		chain.addFilter(new AppFilterB());
		chain.send(msg);
	}

	public static void main(String[] args) {
		new TestChain().send("test msg");
	}
}



cindy里的DefaultFilterChain是定义在AbstractSession里的一个内部类.
程序输出:

Java代码
  1. first inner filter(Dispacher Filter): test msg  
  2. AppFilterA: test msg  
  3. AppFilterB: test msg  
  4. the final  of the chain, NullFilter: test msg  
first inner filter(Dispacher Filter): test msg
AppFilterA: test msg
AppFilterB: test msg
the final of the chain, NullFilter: test msg



以上是一个超简单的模拟cindy里filterChain的一个实现,源码结构大体是这样,当然功能要丰富得多,支持倒序和正序两种chain的执行顺序等.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值