SEDA源码解读(三)

简介:

本篇,我们继续来看看seda的开源项目sandstorm,这次我们主要关注aDisk包的实现:


AFile-通过上一篇我们对SimpleSink的介绍可以看出这是一个对于队列“槽端”的实现,事实上你会发现它并没有真正提供实现,这是一个文件对外的异步访问接口。既然它实现了SinkIF(因为SimpleSink实现了该接口,所以被其继承),那它就可以入队所有对于某一文件的特定请求。

AFileImpl-该类是一个内部类,只提供了包级别的访问权限,它表示了对于AFile的“实现”。这里实现之所以加引号,意思是这里并没有提供真正的实现,它其实还是一个抽象类,定义了一些接口方法而已。真正的实现类会继承该抽象类。

AFileTPImpl-它就是真正的实现类,继承自AFileImpl,它内部有一个队列用来存储事件。并且它使用一个线程池在文件上执行阻塞的I/O。从图上可以看到它同时还实现了QueueElementIF接口,说明它可以是一个事件。

备注从图上可以看到AFile与AFileImpl都继承了SimpleSink,而AFileTPImpl继承自AFileImpl。感觉关系有些乱了。我之前看也是这么认为,但仔细看了之后,其实会发现,还是有些合理的。AFile是一个文件对外的“接口”,包含了对于文件的操作,这些方法内部都是调用了AFileImpl的实现者处理的,而具体调用哪个实现者并不是它关系的问题,应该由管理器来负责。这里共同的目的都是为了保证AFile的简单,纯粹以及内部实现的可扩展性。

下面列出了,对于文件操作的一系列事件:

这里有两个抽象的事件基类:AFileRequest、AFileCompletion,他们都实现了QueueElementIF接口。

先介绍一下这两个抽象事件基类:

AFileRequest-它代表I/O请求的抽象基类,能够入AFile的enqueue()方法。

AFileCompletion-它表示I/O完成事件的抽象基类

AFileRequest的派生类:

AFileReadRequest-表示文件的读请求;

AFileWriteRequest-表示文件的写请求;

AFileFlushRequest-对于一个给定的文件,flush所有的I/O 事件

AFileSeekRequest-对于一个给定位置的给定文件,的查找事件

AFileCloseRequest-关闭一个给定的文件要触发该事件

AFileCompletion的派生类:

AFileIOCompleted-完成事件包括了对于之前的一个I/O请求已经完成

AFileIOExceptionOccurred-该完成事件包括在引发I/O请求时产生的IOException

AFileIOExceptionOccurred-一个在给定的文件上执行I/O操作但已经到达EOF位置的完成事件

AFileTPEventHandler-它是一个事件处理器(实现了EventHandlerIF),用来被AFileTPImpl层调用

AFileTM-内部抽象类,它用来表示一个AFile的线程管理器

AFileTPStageWrapper-它是AFileTPImpl的包装实现,实现了StageWrapperIF。(事实上该StageWrapper并没有一个真实的事件队列,AFileTPTM创建的线程将给予每个AFile提供队列)

AFileTPTM-它继承了TPSThreadManager,同时实现了ThreadManagerIF以及ProfilableIF接口。

(注:TPSThreadManager同样实现了ThreadManagerIF接口,它提供了每个stage,每个source有一个线程池的线程管理器)。它是一个为AFileTPImpl提供的ThreadManager,它管理一个用来在磁盘文件上执行阻塞I/O的线程池。

AFileMgr-它是一个内部类,用来给Sandstorm运行时和aDisk类库之间提供一个访问接口。应用程序不应该使用该类。

其实,作为磁盘I/Ostage的实现,它基本包含了对几个核心package的实现(api/api.internal)。它们大致的对应关系如下图所示:





原文发布时间为:2012-04-21


本文作者:vinoYang


本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

目录
相关文章
|
10月前
vivid源码分析
vivid源码分析
45 0
|
缓存 分布式计算 监控
【源码解读】| LiveListenerBus源码解读(上)
【源码解读】| LiveListenerBus源码解读
134 0
【源码解读】| LiveListenerBus源码解读(上)
|
存储 SQL 分布式计算
【源码解读】| LiveListenerBus源码解读(下)
【源码解读】| LiveListenerBus源码解读
133 0
【源码解读】| LiveListenerBus源码解读(下)
|
存储 分布式计算 监控
【源码解读】|SparkEnv源码解读
【源码解读】|SparkEnv源码解读
105 0
|
存储
HashMap源码解读(下篇)
HashMap源码解读(下篇)
78 0
HashMap源码解读(下篇)
|
存储 Java 索引
HashMap源码解读(中篇)
HashMap源码解读(中篇)
80 0
HashMap源码解读(中篇)
|
存储 数据采集 运维
结合 Sentinel 专栏谈谈我的源码阅读方法
结合 Sentinel 专栏谈谈我的源码阅读方法
结合 Sentinel 专栏谈谈我的源码阅读方法
|
存储 Java 数据库
Java集合源码分析之开篇
初衷 Java集合是我们使用最频繁的工具,也是面试的热点,但我们对它的理解仅限于使用上,而且大多数情况没有考虑过其使用规范。本系列文章将跟随源码的思路,分析实现的每个细节,以期在使用时避免各种不规范的坑。在这里,我们会惊艳于开发者优秀的设计,也会感激先辈们付出的艰辛努力,更重要的是知其所以然,少犯错误,写出优秀的代码。 许多人对集合类的理解是暴力的,当需要保存对象时就使用ArrayList,当需要保存键值对时就使用HashMap,当需要不可重复时就使用HashSet,等等。而且使用方式也比较单一:
164 0
|
iOS开发
fishhook源码分析
最早了解到[fishhook](https://github.com/facebook/fishhook)是看了下面两篇文章之后,顿时让我觉得这是一个非常好的东西。总共210行代码,收获了1500+个star,神作啊。 1. [iOS Lazy Binding](http://www.atatech.org/articles/68014),使用fishhook拦截NSSetUncaughtE
2397 0
|
移动开发 Java 开发者
Stresstester源码分析
stresstester-1.0.jar是早期淘宝的一个压力测试工具,很方便开发人员进行本地代码的压力测试,其他专门压力测试工具也有很多,如:jmeter loadrunner 等等,本篇文章主要讲一下stresstester的源码设计
10582 0