前一篇我们大致的拉通了一遍,mina的整个调度过程。今天我们就谈谈贯串整个mina的Session。
首先我们看看mina中的session接口:org.apache.mina.core.session.IoSession。
接口有如下方法:
long getId();
IoService getService(); //IoAcceptor 和 IoConnector 两种IoService
IoHandler getHandler();
IoSessionConfig getConfig();
IoFilterChain getFilterChain();
WriteRequestQueue getWriteRequestQueue();
TransportMetadata getTransportMetadata();
ReadFuture read();
WriteFuture write(Object message);
WriteFuture write(Object message, SocketAddress destination);
Object getAttribute(Object key);
Object getAttribute(Object key, Object defaultValue);
Object setAttribute(Object key, Object value);
Object setAttribute(Object key);
....
通过接口可以看出IoSession规范了mina中一个session所拥有的行为,以及一个session所承载的对象。比如IoHandler、IoService、IoFilterChain等等。
同时在IoSession中还集成了session在特定IDEL的情况下的处理调用。
通过方法:
public static void notifyIdleness(Iterator<? extends IoSession> sessions, long currentTime)
public static void notifyIdleSession(IoSession session, long currentTime)
其底层调用的是:FilterChain的fireSessionIdle(status)。我们如果要实现自己的Idle和Filter就可以实现:IoFilter ,如果要扩展FilterChain可以实现:IoFilterChain
其实,整个IoSession的调用是
IoSession->IoService(IoAcceptor和IoConnector)->IoFilterChain(通过责任链模式来调用IoFilter)->IoProcessor(完成IoHandler处理)
另外在这个过程中:
①有几个很重要的Queue
IoSession的WriteRequestQueue 其核心就是ConcurrentLinkedQueue<WriteRequest>。该Queue用来给IoProcessor的flushNow使用,完成写操作。其中WriteRequest的Message的
类型不同完成不同的操作。Message的类型分为:IoBuffer、FileRegion。这里段逻辑在AbstractPollingIoProcessor中。
在IoProcessor中又有几个队列,这些队列专门是为多线程并发而考虑的,将要处理的Session先Store下来。
newSessions:A Session queue containing the newly created sessions。
removingSessions:A queue used to store the sessions to be removed。
flushingSessions:A queue used to store the sessions to be flushed。
trafficControllingSessions:A queue used to store the sessions which have a trafficControl to be updated。
以上Queue均是ConcurrentLinkedQueue<IoSession>
②2个Selector
在整个分层过程中涉及到2个Selector。由于分层,这两个Selector所面向的注册对象分别是:IoService层的、IoProcessor层的。
③真正业务关注的:IoHandle和IoFilter。我们可以通过扩展这两个接口来完成我们想要的功能。
④对于底层buffer的选择也是很重要的(后续在看看这部分内容)
下一篇我们将看看IoService的内容