Mina2.0框架源码剖析(二).docx_第1页
Mina2.0框架源码剖析(二).docx_第2页
Mina2.0框架源码剖析(二).docx_第3页
Mina2.0框架源码剖析(二).docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上一篇介绍了几个核心的接口,这一篇主要介绍实现这些接口的抽象基类。首先是实现IoService接口的AbstractIoService类。它包含了一个Executor来处理到来的事件。每个AbstractIoService都一个AtomicInteger类型的id号,确保每个id的唯一性。它内部的Executor可以选择是从外部传递进构造函数中,也可以在实例内部自行构造,若是后者,则它将是ThreadPoolExecutor类的一个实例,即是Executor线程池中的一员。代码如下:if(executor=null)this.executor=Executors.newCachedThreadPool();createdExecutor=true;elsethis.executor=executor;createdExecutor=false; 其中有一个IdleStatusChecker成员,它用来对服务的空闲状态进行检查,在一个服务激活时会将服务纳入到检查名单中,而在服务失效时会将服务从名单中剔除。会单独开一个线程进行具体的空闲检查,这是通过下面这个线程类来负责的:privateclassNotifyingTaskImplimplementsNotifyingTaskprivatevolatilebooleancancelled;/取消检查标志privatevolatileThreadthread;publicvoidrun()thread=Thread.currentThread();trywhile(!cancelled)/每隔1秒检查一次空闲状态longcurrentTime=System.currentTimeMillis();notifyServices(currentTime);notifySessions(currentTime);tryThread.sleep(1000);catch(InterruptedExceptione)/willexittheloopifinterruptedfrominterrupt()Finallythread=null;具体的空闲检查代码如下,超过能容忍的最大空闲时间,就会fire出SessionIdle事件,上文也说过空闲有三种类型:读端空,写端空,双端空。notifyIdleSession1(s,currentTime,s.getConfig().getIdleTimeInMillis(IdleStatus.BOTH_IDLE),IdleStatus.BOTH_IDLE,Math.max(s.getLastIoTime(),s.getLastIdleTime(IdleStatus.BOTH_IDLE);privatestaticvoidnotifyIdleSession1(AbstractIoSessionsession,longcurrentTime,longidleTime,IdleStatusstatus,longlastIoTime)if(idleTime0&lastIoTime!=0¤tTime-lastIoTime=idleTime)session.getFilterChain().fireSessionIdle(status);在释放资源的方法时,首先去获取释放锁disposalLock才行,然后具体的释放动作是通过dispose0完成的,接着取消掉空闲检查线程,此外,若线程是内部创建的线程池中的一员,则通过线程池去关闭线程。publicfinalvoiddispose()IoFuturedisposalFuture;synchronized(disposalLock)/获取释放锁disposalFuture=this.disposalFuture;if(!disposing)disposing=true;trythis.disposalFuture=disposalFuture=dispose0();/具体释放动作catch(Exceptione)ExceptionMonitor.getInstance().exceptionCaught(e);finallyif(disposalFuture=null)disposed=true;idleStatusChecker.getNotifyingTask().cancel();if(disposalFuture!=null)/无中断地等待释放动作完成disposalFuture.awaitUninterruptibly();if(createdExecutor)通过线程池去关闭线程ExecutorServicee=(ExecutorService)executor;e.shutdown();while(!e.isTerminated()trye.awaitTermination(Integer.MAX_VALUE,TimeUnit.SECONDS);catch(InterruptedExceptione1)/Ignore;itshouldendshortly.disposed=true;再来看会话初始化完成后的动作每个session都保持有自己的属性映射图,在会话结束初始化时,应该设置这个AttributeMap。(AbstractIoSession)session).setAttributeMap(session.getService().getSessionDataStructureFactory().getAttributeMap(session);除此以为,还应该为会话配置写请求队列:(AbstractIoSession)session).setWriteRequestQueue(session.getService().getSessionDataStructureFactory().getWriteRequestQueue(session);在初始化时会在会话的属性中加入一项SESSION_CREATED_FUTURE,这个属性会在连接真正建立后从会话中去除。if(future!=null&futureinstanceofC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论