电信营运设计后台:数据采集与整合文档编号:Version1.02008年05月达内IT培训集团修改记录摘要日期修改原因版本2008-05-28新建1.0一、数据采集一、UI设计(无)二、数据采集类图设计(一)数据采集客户端1)类结构概要说明-类图2)类功能结构说明-时序图:CollectionLauchor:CollectionThread:DataCollector:LogDealer:LogRecord:MatchedRecord1:start()2:collect()16:deal(Vector)6:new11:new3:getNativeIP()4:initlog()5:mappingLogBuffer(String)8:parseLogBuffer(MappedByteBuffer,Vector,Vector)7:activate(String)10:passivate(Vector,String)9:match(Vector,Vector)12:new13:init()15:14:initSocket()17:send()3)类详细说明1.CollectionLaunchor采集主程序类,发动采集线程。a)客户采集启动器,主要启动采集线程,单独启动一个线程进行数据采集b)在main函数中创建CollectionThread线程对象,并调用run函数启动线程。创建线程CollectionThreadth=newCollectionThread启动线程th.start();c)注意:该启动器可以由用户发起为一个后台服务,也可以由Unix的定时服务发起,我们采用使用Unix发起的方式。用户后台服务发起的方式只需要把线程的运行方式改变成循环就是。2.CollectionThread采集线程,负责启动采集过程。a)封装一个采集线程。该类主要调用采集器类DataCollector进行数据采集。b)函数run():就是主要创建DataCollector对象,并调用其collection函数进行数据采集。该函数是Thread的run函数覆盖函数.产生DataCollector对象调用数据采集函数collect释放资源线程关闭returnc)函数start():负责启动线程,该函数来自Thread线程类.d)注意:该线程是否循环决定采集器启动的方式是否利用Unix的定时启动功能,如果采用Unix的定时功能,则该线程采集完毕自动关闭清空。3.DataCollector负责采集环境的处理与数据采集,分析处理a)所有的采集任务有该类完成,主要获取本机IP,复制备份并清空日志文件,读取日志文件,解析日志文件,匹配处理日志登录/登出记录获取用户登录时间,在线用户下次匹配。b)函数getNativeIP读取要采集服务器的IP,该IP用属性文件配置。c)函数initlog()负责调用Runtime执行mvshell指令进行日志文件的备份并清空原始文件。备份的文件名wtmpx+年(4位)+月(2位)+日(2位)+时(2位),比如wtmpx2008053013.注意:利用Unix系统的Kenerl函数读取的时候,该文件必须采用x结尾,在这里用java处理就不需要。调用move/var/adm/wtmpx/....指令清空登录历史纪录d)函数mappingLogBuffer主要把备份的日志文件映射为本地内存缓冲,便于后面解析。参数是备份日志文件名,返回MappedByteBuffer.创建/var/adm/wtmpx日志文件的FileInputStream流得到FileChannel通过FileChannel得到日志文件的内存映射MappedByteBuffer已知要采集的日志文件名filenamee)函数parseLogBuffer,负责解析缓冲的内存结构,利用参数返回两个Vector结构对象,一个存放登录数据,一个存放登出数据,Vecotor中存放的元素类型是LogRecord.该类型请参考LogRecord类说明。已知日志数据内存映射MappedByteBuffer对象logbuffer,login与logout两个Vector存放解析结构的结构按照wtmpx文件的二进制格式解析日志数据把解析好的数据形成LogRecord对象把登录数据放入Vector类型的login结构,把登出数据放入Vector类型的logout结构判定日志数据结束返回logout,login两个Vector类型的结构文件没有结束文件结束【参考】#defineEMPTY0#defineRUN_LVL1#defineBOOT_TIME2#defineOLD_TIME3#defineNEW_TIME4#defineINIT_PROCESS5#defineLOGIN_PROCESS6--登录进程#defineUSER_PROCESS7--用户进程#defineDEAD_PROCESS8--终止进程f)函数activate负责把上次为匹配的数据读取为Vector结构。便于后面匹配。参数是存放上次未匹配的登录日志记录,返回Vector结构,其中元素类型LogRecord。已知要读取的数据文件名filename读取数据到Vector结构文件存在判定存在不存在g)函数match,负责匹配登录/登出数据,并返回用户登录时间数据。参数是两个Vector类型的登录/登出数据结构,元素类型是LogRecord,返回的是匹配好的用户登录时长记录,数据类型是Vector,其中元素类型是MatchedRecord,详细说明请参考MatchedRecord类的说明。已知login,logout两个Vector类型的数据结构循环logout结构按顺序得到logout中LogRecord类型的登出对象在login中查找最近的匹配用户与IP计算登录时间产生MatchedRecord对象,并放入Vector类型的结构h)函数passivate,负责把这次没有匹配好的登录记录保存成文件,以便下次采集的时候匹配。参数是没有匹配好的登录记录,类型是Vector,其中元素类型是LogRecord.已知需要保存的Vector类型login结构和文件名filename打开文件保存结构,并关闭文件i)函数collect,负责整个采集过程。这是该类中的唯一的一个public函数,主要供采集线程调用。获取本地IPgetNativeIP初始化日志文件initlog日志文件内存映射mappingLogBuffer登出数据匹配match读取上次未匹配的数据activate注入LogDealer类型的logdealer对象调用logdealer的deal函数进行数据处理保存未匹配数据passivate解析日志parseLogBuffer4.LogRecord类,负责登录/登出数据封装。5.MatchedRecord类,负责匹配好的数据的封装。6.CollectionListener接口,规范采集好的数据的处理方式。a)函数deal,负责匹配好数据的处理,返回void,参数是Vector类型,元素类型是MatchedRecord,是匹配好的所有登录时长数据。7.LogDealer类,负责匹配好数据的发送处理,如果发送失败,则数据被保存。该类主要实现CollectionListener接口。a)函数init,主要初始化服务器参数,服务器参数使用属性文件配置IP与Port。已知服务器连接参数属性文件加载属性文件获取ip与portb)函数initSocket,主要初始化网络连接。如果初始化失败,则保存数据退出c)函数send,主要负责数据发送。该函数先发送历史失败数据。d)函数deal,调用上面的三个函数完成整个处理过程。并接受服务器接收成功的标志。(二)数据采集服务起器端1)数据实体类(原则上对应数据结构的实体表)2)类结构概要说明-类图3)类功能结构说明-时序图:ServerLauncher:DataRecieverTh:CollectionTh:DBEnvInit:DetailDAO:Detail1:start()4:start()2:initDAO()3:initSocket()5:getDBParamter()6:7:getConnection(Properties)8:12:insert(Detail)10:new9:recieve()11:4)详细说明1.ServerLauncher类:服务器数据接受器启动器a)ServerLauncher主要负责启动服务器接受线程b)函数main,主要创建DataRecieverTh对象,并调用起其start函数启动线程。2.DataRecieverTh类,服务器接受主线程。a)主要负责接受客户连接,并为每个客户启动一个数据接收线程来进行客户数据接收。该类继承Thread。b)成员collectionth是Vector的静态数据结构,负责保存所有客户连接。其中元素类型是CollectionTh.c)成员serversocket服务器Socketd)成员dao封装对数据的连接及其对数据表访问封装,具体说明参考DetailDAO说明。e)函数initSocket,负责网络服务器的初始化。f)函数initDAO,负责数据库连接初始化,并初始化数据访问对象dao。g)函数init服务读取数据库连接擦参数的读取,数据库连接参数用属性文件配置driver,url,user,password四个key-value键值对。该过程由DBEnvInit中两个静态函数完成。h)函数run是Thread类的覆盖函数,负责接收客户连接,并建立客户处理线程并启动线程,并在collectionth中记录该客户线程处理对象。3.CollectionTh类,每个客户数据接收处理类。a)该类主要接收采集器发送过来的数据,接收成功后发送一个成功标志,然后保存接收的数据。该类继承Thread。b)函数run接收线程过程,主要调用receive私有函数。c)函数recieve,通过inputstream读取数据,并发送成功标记,然后调用全局的dao保存数据。4.DBEnvInit类,数据库环境初始化类a)该类封装了两个函数工具,完成对数据库的连接。b)函数getDBParamter,负责从属性文件读取数据库连接参数。c)函数getConnection,负责根据连接属性打开与数据库的连接。注意:该工具可以提供对数据源的支持,在后继版本中提供数据源与Hibernate的支持描述。5.DetailDAO类a)提供对Detail数据库的插入等操作访问。b)函数insert负责把接收到的数据插入到数据库。6.BasicDAOEntityType泛型类a)封装对数据库访问最常用的规范。在后面的DAO类,缺省必须实现该接口。7.Detail类,采集数据原始记录实体类。a)该类与MatchedRecord完全一样,在设计的时候为与客户端分开,故意设计成实体类,主要便于使用Hibernate。b)Detail类对应数据库中对应的t_detail_x31张表。注意:该设计中缺少一个日志类,请自行设计,或采用apache中log4j.jar三、数据表结构设计(一)原始采集用户登录时长明细表(details_x)其中x是1-31字段英文名字段汉字名类型约束条件说明loginname登录名Varchar(20)loginip登录IPVarchar(24)logintime登录时间Timestamplogouttime登出时间Timestamplabip实验室IPVarchar(24)duration登录时长long二、数据整合一、UI设计二、数据采集类图设计1.类结构概要说明1)数据实体类结构(原则上对应数据库表)2)数据整合类2.类功能结构说明:ServerLauncher:DataIntegratorTh:IntegrationFactory:IntegrationByClient:BasicDAOEntityType1:start(