Mina源码分析:为何过滤器源码中没有对下一个过滤器为null的处理

来源:互联网 发布:骨维力的副作用 知乎 编辑:程序博客网 时间:2024/04/29 06:23
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()的重任。

原创粉丝点击