Mina源码分析:为何过滤器源码中没有对下一个过滤器为null的处理
作者:ococo 2010.5.11.
为什么过滤器代码中都没有对下一个过滤器为null时的处理?例如:LoggingFilter中的代码
@Override public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception { log(messageReceivedLevel, "RECEIVED: {}", message ); nextFilter.messageReceived(session, message);//why? if(nextFilter!=null) nextFilter.messageReceived(session, message); }
答案:
Mina在FilterChain中增加了头过滤器和尾过滤器。即使用户用getFilterChain().addLast()添加过滤器到集合的尾部,但并不是插入到过滤器链的尾部。其实getFilterChain()返回的并不是FilterChain,而是FilterChainBuilder。在buildFilterChain()时,添加了内置的头和尾过滤器。也就是用户的过滤器保证是在链表的中部。自然也就不用考虑头尾的特殊情况。
当然这个头尾过滤器并不是仅仅为了让用户省掉null才添加的。而是另有用途,尾部过滤器除了有计数功能外,也担当着调用handler的messageReceived()的重任。