... int counterValue = session.getAttribute( "counter" ); session.setAttribute( "counter", counterValue + 1 ); ...
我们有一种方法来处理存储到Session中的属性Attribute:一个Attribute属性就是一个键值对,在Session的容器中可以对它进行添加,删除和读取等操作。
这个容器伴随着Session的创建而自动创建,伴随着Session的终止而被清除。
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都关联着一串过滤器,当接收传入的请求或向外传出消息时这些过滤器就会处理这些信息。这些过滤器是单独针对每个Session的,大多数情况下,我们对当前所有的session都是使用几乎完全一样的过滤器链。然而,动态地修改某个单独的session也是允许的,例如,可以对一个特定的session添加一个日志过滤器。
每个session都会保持跟踪有关该session执行情况的记录,如:
以及,很多其他有用的信息。
最后,一个session必须附带一个处理程序Handler,它不仅负责调度消息到你的应用中,也通过简单地调用session的write()方法,将响应传回:
... session.write( <your message> ); ...