MINA源码解读(二)

前一篇我们大致的拉通了一遍,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的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值