1.调用方式:example DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
chain.addLast("mdc", mdcInjectionFilter);
2.Filter相关类图3.源码解读_DefaultIoFilterChainBuilder
1.DefaultIoFilterChainBuilder内部维护一个Entry的列表
List<Entry> entries = new CopyOnWriteArrayList<Entry>();
2.public synchronized void addLast(String name, IoFilter filter) 内部调用register方法:register(entries.size(), new EntryImpl(name, filter))
其核心代码为:entries.add(index, e);
同理其内部addFirst/addBore/addAfter,均是将filter-pair(Entry)加入到list的不同位置.
3.其实现IoFilterChainBuilder接口内的方法:buildFilterChain(IoFilterChain chain)
for (Entry e : entries) {
chain.addLast(e.getName(), e.getFilter());
}
即调用IoFilerChain的方法组装filter
->所以IoFilterChainBuilder是IoFilerChain的构建接口.
4.源码解读_DefaultIoFilterChain
1.其整体内部实现了一个双向链表.
这里从head,tail以及EntryImpl的定义prevEntry/nextEntry可见一斑.
2.public synchronized void addLast(String name, IoFilter filter)->内部调用register方法:register(tail.prevEntry, name, filter)
将尾部指针的前驱节点(tail.prevEntry)传入作为新节点的前驱节点->
->将tail.prevEntry.nextEntry这里即tail作为新节点的后继节点
3.private void register(EntryImpl prevEntry, String name, IoFilter filter)
1.新建节点newEntry
2.调用filter.onPreAdd
3.调整链表的前驱后继关系并将newEntry加入Map<String, Entry> name2entry
4.调用filter.onPostAdd
5.源码解读_NextFilter
1.DefaultIoFilterChain中节点EntryImpl中有一个private final NextFilter nextFilter
->其表示当前节点filter的下一个IoFilter
2.EntryImp初始化nextFiler是用一个匿名内部类初始化并覆写接口方法
1.messageReceived(IoSession session, Object message)
->调用callNextMessageReceived(nextEntry,session,message),其中nextEntry为当前节点的后继节点
->后继节点执行filter.messageReceived(nextFilter, session, message),其中nextFiler为后继节点的NextFiler对象.
也就是说每个Filter的实现类如果在messageReceived(NextFilter nextFilter, IoSession session, Object message)中调用了nextFiler.messageReceive方法,则表示沿着过滤链继续forward>>>>>>.而IoFilterAdapter的默认实现则是这样.
2.filterWrite(IoSession session, WriteRequest writeRequest)
->调用callPreviousFilterWrite(nextEntry, session, writeRequest),其中nextEntry为当前节点的前驱节点
->前驱节点执行filter.filterWrite(nextFilter, session, writeRequest),其中nextFiler为前驱节点的NextFiler对象.
同上,即每个Filer的实现类如果在filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest)中调用了nextFilter.filterWrite方法,则表示沿着过滤链继续forward<<<<<<<.
6.源码解读_HeadFilter
1.此为DefaultIoFilterChain中头结点的过滤器.
2.此过滤器继承了IoFilterAdapter,所以其messageReceived方法默认调用了nextFiler.messageReceived方法,即收到消息不处理,直接转发后继节点进行过滤处理.
3.其主要覆写了filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) 方法
->由processor处理write.
7.源码解读_TailFilter
1.此为DefaultIoFilterChain中尾节点的过滤器.
2.其继承了IoFilterAdapter并覆写了所有方法:
其中sessionCreated/sessionOpened/sessionIdle/exceptionCaught/messageReceived/messageSent均调用了session.getHandler()的相关方法,即IoHandler,这个我们经常用到且经常写的IoHandler.
而filterWrite/filterClose则直接调用nextFilter.相关方法,即继续沿着过滤链<<<<<forward.
8源码解读_ProtocolCodecFilter
1.此为编解码过滤器,用来编码为二进制数据或者将特定协议的数据解码成消息对象.
2.其覆写了messageReceived:
1.一个while循环,直到buffer没有数据.while(in.hasRemaining)
2.循环内业务为调用decoder.decode方法进行解码
3.调用decoderOut.flush完成解码->{@link ProtocolDecoderOutputImpl #flush}->调用nextFilter.messageReceived,即继续在过滤链进行forward>>>>>>
3.其覆写了filterWrite
1.调用encoder.encoder进行编码
2.调用nextFilter.filterWrite,即继续沿着过滤链进行<<<<<<forward
8.总结
mina的内部采用filer_chain模式进行消息的流转(双向)处理
以读写消息来简单的说明一下filter_chain过程:
1.processor...binary_msg-->>HeadFilter#messageReceived-->>....-->>XXXFilter#messageReceived...-->>TailFilter#messageReceived-->>调用IoHandler#messageReceived
在HeadFilter和TailFilter之间自定义过滤器,如firewall,log,decoder等
2.procotol_msg-->>TailFilter#filterWrite-->>....-->>XXXFilter#FilterWrite....-->>HeaderFilter-->>由processor处理write
在TailFilter和HeadFiler之间可自定义过滤器,如encoder等.
posted on 2013-11-26 17:26
landon 阅读(1666)
评论(0) 编辑 收藏 所属分类:
Sources