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()的重任。
本文解释了Mina框架中的过滤器链设计原理,特别是为何过滤器代码中不需要检查下一个过滤器是否为null。通过介绍Mina如何在FilterChain中自动添加头过滤器和尾过滤器,确保用户自定义过滤器总处于链表中间,从而避免了空指针异常。
5303

被折叠的 条评论
为什么被折叠?



