`

cindy源码阅读(9)SessionFilter

 
阅读更多
SessionFilter用于一些实际的操作后。


SessionFilter是通过SessionFilterChain调用的,SessionFilterChain不断的next,让每一个filter都起作用。
各个filter的优先级别是怎么样的呢:
protected SessionFilter nextFilter() {
            SessionFilter filter = null;
            if (dispatchFilter != null) {
                filter = dispatchFilter;
                dispatchFilter = null;
            } else if ((reversed && --cursor >= 0)
                    || (!reversed && ++cursor < appFilters.length)) {
                filter = appFilters[cursor];
            } else if (operateFilter != null) {
                filter = operateFilter;
                operateFilter = null;
            } else if (decodeFilter != null) {
                filter = decodeFilter;
                decodeFilter = null;
            } else {
                filter = handlerFilter;
                handlerFilter = null;
            }
            return filter;
        }


 private final SessionFilter[] appFilters = filters;
        private int cursor = -1;

        private SessionFilter dispatchFilter = DISPATCH_FILTER;
        private SessionFilter operateFilter;
        private SessionFilter decodeFilter = packetDecoderFilter;
        private SessionFilter handlerFilter = SESSION_HANDLER_FILTER;

大部分都是写死了的。
operateFilter必须通过构造方法传进去,一般很少用这个。
我们能扩展的是appFilters 。session的addSessionFilter其实改变的就是这个appFilters 。所以用的时候直接用addSessionFilter就好了。
 public synchronized void addSessionFilter(int index, SessionFilter filter) {
        if (filter != null) {
            index = Math.max(0, Math.min(filters.length, index));
            SessionFilter[] newFilters = new SessionFilter[filters.length + 1];
            System.arraycopy(filters, 0, newFilters, 0, index);
            System.arraycopy(filters, index, newFilters, index + 1,
                    filters.length - index);
            newFilters[index] = filter;
            filters = newFilters;
        }
    }


还有个经常扩展的地方是:session.setSessionHandler。SessionHandler是怎么起作用的呢。handlerFilter,而且这里的handlerFilter是写死了的,
   private static final SessionHandlerFilter SESSION_HANDLER_FILTER = new SessionHandlerFilter();

private SessionFilter handlerFilter = SESSION_HANDLER_FILTER;

这个SessionHandlerFilter 会去调用SessionHandler。

所以对于session的扩展其实都是通过filter来起作用的。而且扩展的地方也就是
session.addSessionFilter();
                session.setSessionHandler();


session设置解码的话,
session.setPacketDecoder
是通过
private SessionFilter decodeFilter = packetDecoderFilter;
是在read()的时候,触发filterchain的packetReceived方法,然后调用decodeFilter 解码。

session设置编码的话,是在send方法中直接编码的,没有通过filter。
   public Future send(Object obj, int priority) {
        Packet packet = null;
        try {
            packet = encoder.encode(this, obj);
        } catch (Exception e) {
            dispatchException(e);
            return new DefaultFuture(this, false);
        }
        return send(obj, packet, priority);
    }



可以看到SessionFilter和SessionHandler这两个接口的方法是一样的,可见他们的关系很密切,其实就是SessionHandler被SessionFilter调用。
  • 大小: 38.3 KB
0
0
分享到:
评论

相关推荐

    开源nio框架cindy源码

    Cindy-3.0b1-src这个版本是Cindy框架的源代码包,对于开发者来说,了解其源码可以帮助深入理解NIO框架的设计原理和实现细节。下面将详细介绍这个框架可能包含的关键知识点: 1. **Java NIO基础**:Cindy是建立在...

    cindy最新源码和库

    通过阅读源码,你可以了解到如何实现几何变换、碰撞检测、光线追踪等图形学基础算法。 Cindy库主要包括以下几个关键部分: 1. **几何数据结构**:Cindy提供了多种数据结构来表示几何对象,如点、线段、多边形等。...

    cindy.jar 源码工具包

    cindy.jar 源码工具包

    基于java的开发源码-异步IO框架 Cindy.zip

    基于java的开发源码-异步IO框架 Cindy.zip 基于java的开发源码-异步IO框架 Cindy.zip 基于java的开发源码-异步IO框架 Cindy.zip 基于java的开发源码-异步IO框架 Cindy.zip 基于java的开发源码-异步IO框架 Cindy.zip ...

    异步IO框架 Cindy源码

    9. **连接池(Connection Pool)**:为了提高性能,Cindy可能实现了连接池,用于复用已建立的连接,减少新建连接的开销。 10. **协议处理(Protocol Handling)**:Cindy可能包含对TCP、UDP等常见网络协议的支持,...

    JAVA源码异步IO框架CindyJAVA源码异步IO框架Cindy

    JAVA源码异步IO框架CindyJAVA源码异步IO框架Cindy

    基于Java的实例源码-异步IO框架 Cindy.zip

    5. **Cindy源码分析**:通过阅读和分析Cindy的源码,我们可以深入理解其内部工作原理,包括事件循环的实现、回调机制的调度以及如何优雅地处理并发问题。这对于提升Java并发编程和系统优化的能力非常有价值。 6. **...

    Cindy 3.0b1 的源码--- Mina的兄弟

    Netty、Mina、Cindy都是不错的NIO开源框架,后两者都是在Netty的基础上演化出来的。所以要学习好Java的异步通信框架,这三个都是不可多得的好材料。 本资源仅供学习和参考使用,若要进行开发,请下载相应的Jar包

    异步IO框架 Cindy

    在源码层面,Cindy可能采用了面向对象的设计模式,通过类和接口来封装各种IO操作和事件处理。同时,为了保持代码的可读性和可维护性,Cindy可能会遵循一定的设计原则,如单一职责原则、开闭原则等,并使用模块化设计...

    java源码:异步IO框架 Cindy.rar

    《Java异步IO框架Cindy深度解析》 在Java编程领域,异步I/O(Asynchronous Input/Output)已经成为高性能网络应用开发的关键技术之一。它允许程序在等待数据准备就绪时执行其他任务,显著提高了系统资源利用率和...

    小程序 异步IO框架 Cindy(源码).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    Cindy components v6.53 for All Delphi

    Packages with 71 components for all delphi versions (since D7) to build Windows 32/64 bit applications: VCL controls (labels, buttons, panels, Edits, TabControls, StaticText) with features like ...

    Cindy components for all delphi versions v3.23 Full Source

    《Cindy组件:全Delphi版本v3.23完整源码详解》 Cindy组件是为Delphi开发者提供的一套强大且美观的界面控件库,特别适用于那些追求个性化和高质量用户界面的项目。在"V3.23 Full Source"版本中,开发者将获得完整的...

    Cindy components for all Delphi versions

    Packages with 76 components for all delphi versions (since D7) to build Windows 32/64 bit applications: VCL controls (labels, buttons, panels, Edits, TabControls, StaticText) with features like ...

    Cindy components for all Delphi versions 6.60

    delphi 控件,优秀的界面设计工具 TcyBevel: multi colored bevels. - TcyPanel: runtime resize feature, multi colored bevels, gradient and shadow feature. - TcyAdvPanel: like TcyPanel plus wallpaper ...

    基于Java的异步IO框架 Cindy.zip

    Cindy是一个这样的框架,它旨在简化Java中的异步编程模型,提供更好的性能和可扩展性。让我们深入探讨Cindy框架以及Java异步I/O的相关知识点。 ### 1. Java的异步I/O模型 在传统的Java I/O模型中,如BIO(Blocking...

    基于java的异步IO框架 Cindy.zip

    下面我们将深入探讨Java异步IO的基本概念、Cindy框架的特点以及如何使用Cindy进行实际开发。 首先,理解Java中的异步I/O。在Java标准库中,NIO(New IO)提供了一种异步I/O操作的机制。传统的Java IO基于阻塞I/O...

    基于C#开发的桌面宠物程序源码+可执行程序+项目说明.zip

    运用了Cindy723/PyRPA: 基于Pyautogui的自动化工具 的脚本 unity和win混合 【使用方法】 Releases里下载双击运行Mion_pet.exe即可; 【备注】 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的C#学习者。 ...

    Netty 3.0.2.GA 的源码--- Mina的兄弟

    Netty、Mina、Cindy都是不错的NIO开源框架,后两者都是在Netty的基础上演化出来的。所以要学习好Java的异步通信框架,这三个都是不可多得的好材料。 本资源仅供学习和参考使用,若要进行开发,请下载相应的Jar包。

    Cindy Components v4.42.Full.Source.zip

    9. **源代码提供**:作为"Full.Source"版本,该压缩包提供的不仅是编译后的二进制组件,还包括源代码。这意味着开发者可以深入理解其工作原理,根据需要进行修改和扩展。 10. **文档和示例**:好的组件包通常会附带...

Global site tag (gtag.js) - Google Analytics