• Mina学习之IoSession


    Session(会话)是Mina的核心部分:每当一个clinent连接到server时,都会创建一个新的session,并且保存在内存中知道该链接断开。

    session 是用来存储一些关于连接信息,加上各种服务端在处理请求时可能会用到的信息。

    Session state

    session有一个状态,并且会随着时间变化。

    1. Connected:session已经被创建并且是可用的
    2. Idle:session 在一段时间(可配置)能没有处理任何请求。

       A:Idle for read:在一段时间内没有任何读发生  
       
       B:Idle for write:在一段时间内没有任何写发生  

       C:Idle for both:在一段时间内没有任何读写发生

    3. Closing:session出于关闭过程中

    4. Closed:session已关闭,不能再使用

    下图为session的状态图

    Configuration

    我们可以为一个session设置很多参数

    1. receive buffer size:接受缓冲区的大小

    2. sending buffer size:发送缓冲区的大小

    3. Idle time:空闲确认时间

    4. 写数据超时时间

    加上一些其他的设置,依赖于通讯类型。

    Managing user-defined attributes

    session中可以已键值对(key - value)的方式存放数据,然后再后续过程中使用。例如你想跟踪一个session自从被创建后已经发送了多少个请求,通过将笔数计入到session

    中就可以很容易的实现该功能。

    int counterValue = session.getAttribute( "counter" );
    session.setAttribute( "counter", counterValue + 1 );

    Defining the container

    上面讲到了session中存放数据,是用了session中默认的container是使用map结构,但是我们依然可以自定义另一种数据结构来存放数据,这可以解决如果我们想避免存储那

    些很大的数据在内内存中。可通过实现一个factory接口,该接口在session创建中将会被用于创建容器(container)。

    以下代码展示了在session初始化过程中如何创建container的

    protected final void initSession(IoSession session,
            IoFuture future, IoSessionInitializer sessionInitializer) {
        ...
        try {
            ((AbstractIoSession) session).setAttributeMap(session.getService()
                    .getSessionDataStructureFactory().getAttributeMap(session));
        } catch (IoSessionInitializationException e) {
            throw e;
        } catch (Exception e) {
            throw new IoSessionInitializationException(
                    "Failed to initialize an attributeMap.", e);
        }
        ..

    以下代码则展示了如果我们想要自定义container则需要实现的工厂类接口:

    public interface IoSessionDataStructureFactory {
        /**
         * Returns an {@link IoSessionAttributeMap} which is going to be associated
         * with the specified <tt>session</tt>.  Please note that the returned
         * implementation must be thread-safe.
         */
         IoSessionAttributeMap getAttributeMap(IoSession session) throws Exception;
     }

    Filter Charin

    每一个session都会关联一个filters chain,这些filter对每一个session之间都是独立的,即使在所有的session中使用相同的filter chain.

    然而,我们也可以为某一个session添加一个filter。例如为某一指定的session添加一个Logger Filtter。

    Statistics

    每一个Session也可记录下在这个session中所有的操作:

    1.  接受或发送的字节数

    2.  接受或发送的消息数

    3. 空闲状态

    4. 吞吐量

    和一些其他有用的信息

    Handler

    最后,尤为重要的是,每个session都会附加上一个IoHandler,负责发送消息给应用程序,并且通过session发送应答包,调用方法write()。

    session.write( <your message> );

    至此,已将IoSession介绍完了,下篇将介绍IoFilter。

  • 相关阅读:
    python测试开发django(27)--发送html格式邮件
    python测试开发django(26)--发送邮件send_mail
    python测试开发django(25)--表单提交之post修改密码
    python测试开发django(24)--表单提交之post登录案例
    python测试开发django(23)--表单提交之post注册案例
    python测试开发django(22)--表单提交之get请求
    [模拟] Codefroces 1175B Catch Overflow!
    [gcd,灵感] Codeforces 1200C Round Corridor
    [最短路,floyd] Codeforces 1204C Anna, Svyatoslav and Maps
    [最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path
  • 原文地址:https://www.cnblogs.com/marcotan/p/4256973.html
Copyright © 2020-2023  润新知