会话处于 MINA 的核心位置:每当一个客户端连接到服务器,一个新的会话会被创建,并会在客户端关掉连接前一直保存在内存中。
会话用于保存连接的持久信息,以及在请求处理过程中、会话的生命周期中服务器可能需要用到的任何信息。
会话的状态
会话会有一个随着时间演变的状态:
已连接:会话已被创建并可用
闲置:会话在至少一段时间 (这段时间是可配的) 内没有处理任何请求
读闲置:在一段时间内没有任何读操作
写闲置:在一段时间内没有任何写操作
同时闲置:在一段时间内既没有读操作也没有写操作
关闭中:会话正在关闭中 (还有正在清空的消息,清理尚未结束)
已关闭:会话现在已被关闭,没有其他方法可以将其恢复。
以下状态图揭示了所有可能的状态及其转换:
配置
对于特定会话可以设置以下不同的参数:
...
int counterValue = session.getAttribute( "counter" );
session.setAttribute( "counter", counterValue + 1 );
...
这样就有了将保存属性放进会话的方法:属性就是一个键值对,它可以从会话的容器中添加、删除以及读取。
容器在会话创建时会被自动创建,而在会话结束时会被清理。
定义容器
如上所述,容器是存储键值对的容器,默认情况下是一个 Map,但是也可以定义做其他的数据结构,如果你想处理长寿命周期的数据,或者避免将所有大数据都存储在内存:我们可以实现一个接口和一个工厂用于在会话建立时创建容器。
以下代码演示了会话初始化时容器的创建:
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);
}
...
如果我们想要定义其他类型的容器,这里是我们可以实现的工厂接口:
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;
}
过滤器链
每个会话会关联到一个过滤器链,在连入一个请求或者接收/发出消息时这个过滤器链将会对其处理。这些过滤器针对于每个每个单独的会话,在多数情况下,会为所有现有会话使用同一个过滤器链。
但是,也可以为单个会话动态修改过滤器链,比如为指定的会话的过滤器链添加一个日志过滤器。
统计
每个会话也会保持对会话处理结束的一些记录的跟踪:
...
session.write( <your message> );
...
原文链接: http://mina.apache.org/mina-project/userguide/ch4-session/ch4-session.html。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://defonds.blog.csdn.net/article/details/18039127
内容来源于网络,如有侵权,请联系作者删除!