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。