




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上文的内容还有一些没有结尾,这篇补上。在ExpiringMap类中,使用了一个私有内部类ExpiringObject来表示待检查超时的对象,它包括三个域,键,值,上次访问时间,以及用于上次访问时间这个域的读写锁:privateKkey;privateVvalue;privatelonglastAccessTime;privatefinalReadWriteLocklastAccessTimeLock=newReentrantReadWriteLock();而ExpiringMap中包括了下述几个变量:privatefinalConcurrentHashMapdelegate;/超时代理集合,保存待检查对象privatefinalCopyOnWriteArrayListExpirationListenerexpirationListeners;/超时监听者privatefinalExpirerexpirer;/超时检查线程现在再来看看IoSession的一个抽象实现类AbstractIoSession。这是它的几个重要的成员变量:privateIoSessionAttributeMapattributes;/会话属性映射图privateWriteRequestQueuewriteRequestQueue;/写请求队列privateWriteRequestcurrentWriteRequest;/当前写请求当要结束当前会话时,会发送一个一个写请求CLOSE_REQUEST。而closeFuture这个CloseFuture会在连接关闭时状态被设置为”closed”,它的监听器是SCHEDULED_COUNTER_RESETTER。close和closeOnFlush都是异步的关闭操作,区别是前者立即关闭连接,而后者是在写请求队列中放入一个CLOSE_REQUEST,并将其即时刷新出去,若要真正等待关闭完成,需要调用方在返回的CloseFuture等待publicfinalCloseFutureclose()synchronized(lock)if(isClosing()returncloseFuture;elseclosing=true;getFilterChain().fireFilterClose();/fire出关闭事件returncloseFuture;publicfinalCloseFuturecloseOnFlush()getWriteRequestQueue().offer(this,CLOSE_REQUEST);getProcessor().flush(this);returncloseFuture;下面来看看读数据的过程:publicfinalCloseFutureclose()synchronized(lock)if(isClosing()returncloseFuture;elseclosing=true;getFilterChain().fireFilterClose();/fire出关闭事件returncloseFuture;publicfinalCloseFuturecloseOnFlush()getWriteRequestQueue().offer(this,CLOSE_REQUEST);getProcessor().flush(this);returncloseFuture;privateQueuegetReadyReadFutures()/返回可被读数据队列QueuereadyReadFutures=(Queue)getAttribute(READY_READ_FUTURES_KEY);/从会话映射表中取出可被读数据队列if(readyReadFutures=null)/第一次读数据readyReadFutures=newCircularQueue();/构造一个新读数据队列QueueoldReadyReadFutures=(Queue)setAttributeIfAbsent(READY_READ_FUTURES_KEY,readyReadFutures);if(oldReadyReadFutures!=null)readyReadFutures=oldReadyReadFutures;returnreadyReadFutures;publicfinalReadFutureread()/读数据if(!getConfig().isUseReadOperation()/会话配置不允许读数据(这是默认情况)thrownewIllegalStateException(useReadOperationisnotenabled.);QueuereadyReadFutures=getReadyReadFutures();/获取已经可被读数据队列ReadFuturefuture;synchronized(readyReadFutures)/锁住读数据队列future=readyReadFutures.poll();/取队头数据if(future!=null)if(future.isClosed()/关联的会话已经关闭了,让读者知道此情况readyReadFutures.offer(future);elsefuture=newDefaultReadFuture(this);getWaitingReadFutures().offer(future);/将此数据插入等待被读取数据的队列,这个代码和上面的getReadyReadFutures类似,只是键值不同而已returnfuture;再来看写数据到指定远端地址的过程,可以写三种类型数据:IoBuffer,整个文件或文件的部分区域,这会通过传递写请求给过滤器链条来完成数据向目的远端的传输。publicfinalWriteFuturewrite(Objectmessage,SocketAddressremoteAddress)FileChannelopenedFileChannel=null;tryif(messageinstanceofIoBuffer&!(IoBuffer)message).hasRemaining()/空消息thrownewIllegalArgumentException(messageisempty.Forgottocallflip()?);elseif(messageinstanceofFileChannel)/要发送的是文件的某一区域FileChannelfileChannel=(FileChannel)message;message=newDefaultFileRegion(fileChannel,0,fileChannel.size();elseif(messageinstanceofFile)/要发送的是文件,打开文件通道Filefile=(File)message;openedFileChannel=newFileInputStream(file).getChannel();message=newDefaultFileRegion(openedFileChannel,0,openedFileChannel.size();catch(IOExceptione)ExceptionMonitor.getInstance().exceptionCaught(e);returnDefaultWriteFuture.newNotWrittenFuture(this,e);WriteFuturefuture=newDefaultWriteFuture(this);getFilterChain().fireFilterWrite(newDefaultWriteRequest(message,future,remoteAddress);/构造写请求,通过过滤器链发送出去,写请求中指明了要发送的消息,目的地址,以及返回的结果/如果打开了一个文件通道(发送的文件的部分区域或全部),就必须在写请求完成时关闭文件通道if(openedFileChannel!=null)finalFileChannelfinalChannel=openedFileChannel;future.addListener(newIoFutureListener()publicvoidoperationComplete(WriteFuturefuture)tryfinalChannel.close();/关闭文件通道catch(IOExceptione)ExceptionMonitor.getInstance().exceptionCaught(e););returnfuture;/写请求成功完成最后,来看看一个WriteRequestQueue的实现,唯一加入的一个功能就是若在队头发现是请求关闭,则会去关闭会话。privateclassCloseRequestAwareWriteRequestQueueimplementsWriteRequestQueueprivatefinalWriteRequestQueueq;/内部实际的写请求队列publicCloseRequestAwareWriteRequestQueue(WriteRequestQueueq)this.q=q;publicsynchronizedWriteRequestpoll(IoSessionsession)WriteRequestanswer=q.poll(session);if(answer=CLOSE_REQUEST)AbstractIoSession.this.close();dispose(session);answer=null;returnanswer;publicvoidoffer(Io
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 付费培训合同模板怎么写(3篇)
- 离婚房产分割与子女抚养及共同财产分割协议范本
- 离婚协议经典案例:财产分配及子女抚养权约定
- (正式版)DB65∕T 4414-2021 《机采棉水肥一体化化肥减量增效技术规程》
- 双方离婚子女抚养权及监护责任明确协议模板
- 《离婚协议书签订后子女抚养权变更与执行》
- 离婚协议书:子女抚养及财产分割执行合同
- 离婚后夫妻共同债务分割及个人债务承担补充协议范本
- 私募股权基金股权转让合同中标的权的限制与解除机制
- 四川特色离婚财产分配合同
- 白酒分销商合同协议书
- 数字人民币发展面临的挑战与优化策略
- 《医学中心肺癌诊疗》(讲课课件)
- 《肺炎克雷伯菌感染》课件
- 小学生科普课视错觉课件
- 电力安全微课堂
- 质量部长述职报告
- 无人机技术在农业领域的可行性分析报告
- 规模灵活资源广域接入的新型配电系统分层分群架构与规划技术研究
- 音乐心理学理论-洞察分析
- 法院报名登记表
评论
0/150
提交评论