资源预览内容
第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
第9页 / 共31页
第10页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
框架下开发基于新框架的开发目录结构billing40/frame/svr/xdrframe/frame_interface.h 框架billing40/app/framefile/frame_file_interface.h文件(输入,输入,事物控制,状态) billing40在products/openboss/billing40用:cvs_co products/openboss/billing40cd products/openboss/billing40cvs_up r ob20_dev开发如批价:class CRatingThread : public CThreadPublic:Virtual int32 init();Virtual int32 destroy();Virtual int32 run(CData *p);virtual int32 exception(CData *p);virtual int32 control(DOMNode & resultDoc, const DOMNode & controlDoc);CThread *create_instanceRating()Return new CRatingThread();l 所有在框架下运行的lib都有一个class,这个class直接或间接继承CThreadl 在这个class里,须实现虚拟函数run。如:对批价来说run的参数p就是一个xdr的指针l Lib里还须提供一个函数,创建这个class的对象,如上面create_instance,框架为每个线程创建一个class的对象。l 每个线程一个CRatingThread对象,在CRatingThread里的数据都是线程安全的l 处理完成的数据,调用send_data(void *p, const int32& iIndex),把数据送到下一个节点(模块)。参数iIndex,是在当前节点的处理结果要分开输出到不同节点时用。如正确话单iIndex=0, 错单iIndex=1。l Init函数。线程初始化。如读配置文件,连接到MDBserver等。l 时钟,CTime *g_pTime,每100微秒更新一次。CTime里有多格式的时间,可以直接使用,如批价使用的process_time。CTime的声明见下面l 配置文件采用xml,而且原来有一些配置到数据库表里的配置也移到了配置文件,框架和数据库没有关系了,不再提供otl_connect,也没有了数据库帐号,读取配置项统一用CThread里的read_config 。框架已经对配置文件进行了初始化,各模块不需要再对配置文件做初始化,直接读取即可。框架提供了一些读取配置项的宏,可以方便地读取到配置项。如业务分析的配置,见下面举例。l 多线程框架在名字空间bs_frame里l 包含头文件frame_interface.h,编译时使用-lFrameDl Exception函数是异常时的处理,如批价,在异常时,把话单打成错单。l 写日志统一采用CThread:LogAppend,框架可以会把一些日志发到前台。同时,通过这个函数写日志时,框架会自动的写日志的线程所在的流水线和节点的信息加上。这也带来了一个麻烦,写日志时必需有一个CThread对象(业务处理模块都有一个类(A)从CThread派生,在这个类里可以直接调用LogAppend,在其它不是从CThread类派生的类里,如果需要写日志,需要把A的指针传给它,以使这些类也可以写日志。)l 节点级变量,当节点内的所有线程使用相同的变量时,变量可以放到节点里,变量在节点内只有一份,节点级变量只能被设置一次。class CTimepublic: struct timeval m_tmVal; / m_tmVal. tv_sec从1970年到当前时间的秒数, m_tmVal. tv_usec 精确到微秒 struct tm m_tm; int32 m_iYYYYMMDD; /YYYYMMDD int32 m_iYYYYMM; /YYYYMM int32 m_iYYYY; /YYYY int64 m_llYYYYMMDDHH24MISS; /YYYYMMDDHH24MISS char m_szYYYY8; /YYYY char m_szYYYYMM8; /YYYYMM char m_szYYYYMMDD9; /YYYYMMDD char m_szYYYYMMDDHH24MISS15; /YYYYMMDDHH24MISS char m_szDateTimeMs / YYYY-MM-DD HH24:MI:SS.MS6后面是6位数的微秒 static char *to_stringDateTime(char *szBuf, const time_t& lTime); static char *to_stringDate(char *szBuf, const time_t& lTime); static int64& to_stringDateTime(int64& llDateTime, const time_t& lTime); static int32& to_stringDate(int32& iDate, const time_t& lTime);事物控制事物控制总的指导思想是,对有需要做事物控制的模块,将其处理完成的结果及时保存到tmp文件,事物提交时,将tmp文件改成正式文件。灾难发生时,对已经处理过的数据,使用已经保存的tmp文件里的结果,不再重新处理。查重有两种方法,暂时使用第1种,对第2种的支持以后再加进去:1、 查重现在本身有事物控制,不需要在查重外另做控制。灾难时,删除tmp文件,启动进程,就可以了。2、 查重提交一次索引文件作为一个事物,提交完索引文件时,发出一个事物完成消息,由查重之外的模块完成事物控制(删除临时文件)。一次事物可能是处理多个文件。批价和出帐一条话单作为一个事物,事物完成不需发要事物完成消息。批价和出帐后面会挂一个输出模块,把话单及时保存到tmp文件。其它模块各模块的处理在billing40/framefile/frame_file_interface.h里,有两个类, CProcessFileTherad和CProcessCdrThread,这两类都是从CThread派生。处理文件的模块都从CProcessFileThread派生,处理话单的模块都从CProcessCdrThread派生。解码要做的事情1、 用输入的pFrameFile参数调用get_inputFileDesc()获得一个输入文件的句柄,使用这个句柄读取输入文件的内容。2、 用输入的pFrameFile参数调用const char *get_inputFileName() const获得输入文件名。3、 解码,每解一条话单,new一个CXdr,解码出来的xdr,设置一些属性,并把它放入文件。参考下面代码。4、 最后,用send_data把话单送到下一模块。#include class CDecodeThread : public bs_frame_file:CProcessFileThreadpublic:int32 init();int32 destroy();int32 run(bs_frame_file:CFrameFile* pFrameFile)Int32 iFileDesc = pFrameFile -get_inputFileDesc();for()Bs_frame_file:CXdr *pXdr = pFrameFile - get_newXdr();If(decode(xdr, buf) != 0)/解码失败pFrameFile -delete_xdr(pXdr); continue;/解码成功if(normal)/正确话单send_data(pXdr);else/错单send_data(pXdr, 1);pFrameFile - end_decodeFile ();return 0;private:;bs_frame:CThread *create_instanceDecode()Return new CDecodeThread ();查重要做的事情1、从输入的pFrameFile, 通过get_xdrBegin(),get_xdrEnd()和get_xdrNext()获得每条话单。#include class CDupThread : public bs_frame_file: CProcessFileThreadpublic:int32 init();int32 destroy();int32 run(bs_frame_file:CFrameFile* pFrameFile)Bs_frame_file:CXdr *pTmpXdr=NULL; Bs_frame_file:CXdr *pEndXdr= pFrameFile -get_xdrEnd();For(Bs_frame_file:CXdr *pXdr= pFrameFile -get_xdrBegin();pXdr!= pEndXdrpXdr= pTmpXdr)Check_dup();pTmpXdr= pFrameFile -get_xdrNext(pXdr);If(pTmpXdr = pEndXdr)Commit index file; /提交查重索引文件if(normal)/正确话单send_data(pXdr);else/错单send_data(pXdr, 1);return 0;private:;bs_frame:CThread *create_instanceDup()Return new CDupThread ();批价要做的事情(还有业务分析)1、run的输入是一个xdr,直接开始批价。2、处理时,如果需要拆话单,先从xdr里获得文件的句柄,再调用它的add_record函数。如下面代码
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号