《接口详细设计文档(32页).doc》由会员分享,可在线阅读,更多相关《接口详细设计文档(32页).doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-接口详细设计文档-第 31 页接口详细设计文档作者:唐为(为哥)审核:赵锟日期:2005-5-27接口详细设计文档11编写目的32名词解释33组件分布图44程序结构54.1接入处理线程类图54.2接收线程类图64.3启动控制图65程序设计说明75.1对原系统的改动75.2ThreadInSvcProcessor 接入处理器85.2.1类图85.2.2时序图95.2.3流程图95.2.4ThreadInSvcProcessor类说明115.3PatternNewSyncAsyncInnerDir 同异步向内处理模式165.3.1类图165.3.2描述175.3.3流程图175.3.4类说明19
2、5.4ThreadReplySvcProcessor 异步应答返回处理器245.4.1类图245.4.2类说明245.5ClientInfo 客户端连接数据335.5.1类图335.5.2类描述335.6ClientInfoTable 客户端连接数据表345.6.1类图345.6.2类描述345.7ClientInfoTableMonitor 客户端连接数据表监控程序385.7.1类图385.7.2类说明385.8FrontMain 主控程序405.8.1类间关系405.8.2流程图415.8.3类说明425.9问题441 编写目的预期读者:对接口行为和目的有一定了解的人背景说明n 软件系统名
3、称:接口前端接入服务器n 描述 接收不同商家的接入,接收数据转发给主机服务器,并同步/异步将返回数据发给接入商家的行为2 名词解释n ChannelBase渠道,通信基类,提供数据收发和释放的方法接口用子类实现来封装了不同通信方式 目前有TCP短连接接入, 从ACE Message_Queue中读取(IPC MessageQueue- ACE_Message_Queue)n Trade* trade商家对象,代表的其实是针对该商家处理方法的集合将接入数据的商家称为服务商家而将请求面向的商家称为主机商家,主机商家负责同步/异步返回交易的应答数据给接口平台n 而接口(数据交换)平台是在两者之间的交
4、换平台n 渠道工厂:把接入数据的渠道工厂统一定为服务渠道工厂,发送数据的渠道工厂统一定为主机通道工厂服务商家接口平台主机商家查不到,丢弃返回应答线程组ATM接入服务器ATM连接队列TCP渠道IPC消息队列渠道commserverIPC消息队列注各种服务渠道和主机通道抽象类都是相同的基类ChannelBase,只是作用不同渠道工厂生成各种渠道IPC消息队列commserver银联接入服务渠道抽象代表各种接入服务渠道接出服务渠道抽象TCP渠道IPC消息队列渠道发送请求线程组后台服务器连接监视器IPC消息队列通知清除超时间连接记录表接收线程接收IPC消息总控接入主机通道抽象IPC消息队列渠道3 组件
5、分布图ATM4 程序结构4.1 接入处理线程类图PatternNewSyncAsyncInnerDir是ProcessPattern的一个子类,实现发送主机服务器并判断同/异步返回同步直接返回给接入商家异步只做相应记录ProcessPattern是后续处理的全部流程抽象类子类实现对应不同流程ThreadInSvcProcessor是接入处理线程的主流程收数,接包无误后将处理控制权交给ProcessPattern4.2 接收线程类图4.3 启动控制图5 程序设计说明5.1 对原系统的改动n 改变原有商家Trade类,不存放渠道对象在商家类中,商家类只执行商家处理,不负责渠道的管理n 改动原有的系
6、统中所有模式的处理,模式处理必须对渠道的释放负责n 修改MidHstChannel,添加后台服务需要的个FML字段,这两个字段是:FML域名描述S_INTERF_NO接口标识号,整数。系统中接收异步响应程序的唯一编号。用于标识请求的来源,异步应答根据这个号码分发给具体的接口程序。S_TX_CTRL_ATTR交易控制属性,字符串。接口都填0,表示这是正常的交易请求。5.2 ThreadInSvcProcessor接入处理器5.2.1 类图5.2.2 时序图预先说明:n ChannelBase渠道通信基类,提供数据收发和释放的方法接口用子类实现来封装了不同通信方式。目前有 TCP短连接接入。从AC
7、E Message_Queue中读取(IPC MessageQueue- ACE_Message_Queue)n Trade* trade商家:代表的其实是针对该商家处理方法的集合5.2.3 流程图服务商家商家渠道工厂GetChannel商家通过渠道收取数据商家的输入处理渠道没取到退出?超时?安全出错?请求:执行安全出错模式PatternErrorSyncInner处理模式请求/应答YesNo执行识别出的模式处理Yes同异步模式PatternNewSyncASyncInnerDirPatternASyncInnerDir应答丢弃5.2.4 ThreadInSvcProcessor类说明5.2.
8、4.1 功能收取用不同渠道接入的外部商家的请求识别,解包执行处理的模式具体的流程在模式中控制,并不做控制模式可能有3种:1. 无返回:发送后台,不接收应答对应模式PatternASyncInnerDir,需要修改原来的相关程序,在本文档中并不涉及2. 有返回,根据返回的应答判断是同步返回还是异步返回如果接收的应答表明是同步返回,按正常模式返回如果接收的应答表明是异步返回,按异步模式处理对应模式PatternNewSyncASyncInnerDirThreadInSvcProcessor后续的ProcessPattern 应该是PatternNewSyncASyncInnerDir.Thread
9、InSvcProcessor只负责接入后调用模式,并处理异常情况3. 安全异常情况的模式下,调用模式PatternErrorSyncInner来处理,必须限制:主要的改动是渠道的释放由模式来管理涉及模式有 PatternASyncInnerDir , PatternNewSyncASyncInnerDir , PatternErrorSyncInner (可能不全面)5.2.4.2 程序描述ThreadInSvcProcessorThreadInSvcProcessor(Trade* ptrade , SvcChannelFactory* pfactory, bool*_bexit)功能:构造
10、函数性能:输人项:Trade* trade接入数据处理的商家类SvcChannelFactory* pfactory接入数据渠道工厂bool* exit退出标志输出项:注释:5.2.4.3 程序描述SvcRunvoid SvcRun()功能:主控流程输人项:无输出项:无流程:服务商家在开始已经生成,生存周期里一直存在一个DataBus对象(数据总线),每线程一个DataBus对象。在生存周期里一直存在DataBus对象初始化循环处理SINT32 ret = a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus*
11、pDataBus );if(bool* exit = true )释放渠道跳出循环为下一次使用清空DataBus对象收尾处理,释放recv_trade5.2.4.4 程序描述a_process_loopSINT32 a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus )功能:一次交易的处理输人项:Trade* pTrade , 接收数据的服务商家服务渠道SvcChannelFactory* pFactory,服务商家接收数据的主机通道SvcChannelFactory * pFactory
12、服务商家渠道的生成工厂。DataBus* pDataBus预先创建的数据总线,不需要每次重建输出项:S_OK成功完成其他出错信息流程:依次执行GetChannel生成接入渠道ChannelBase* (根据商家生成一个ChannelBase的子类)除非出错,整个流程不释放该ChannelBase , 委托给Patten负责释放TradeRecvData 服务商家接收数据TradeInProcess服务商家进入处理(最主要一项功能就是接口识别)If( TradeInProcess 成功 & 安全函数出错 ) /安全函数一般是mac校验失败根据p_databus- pack_type 对请求和应答
13、作2种不同的处理if( pack_type 是请求 ) 执行 RequestSecureFailedProcess 函数调用else /应答报文结果是应答 直接丢弃,返回成功不管结果如何都跳到异常处理,但是返回值可能因SecureFailedProcess的执行结果而不同else否则生成Patern对象生成对方商家hst_trade生成模式对象Pattern,将服务商家和对方商家传入执行ExecPattern执行具体的模式处理,将渠道委托给Patten负责释放异常处理:记录出错信息和时间当异常发生在ExecPattern之外,释放渠道结束处理:(无论异常与否都执行):释放对方商家 st_tra
14、de释放模式对象Pattern注释:为了便于单元测试,从SvcRun中分离出该方法也可以在SvcRun中实现上述的全部逻辑5.2.4.5 程序描述GetChannelSINT32 GetChannel(SvcChannelFactory* factory, ChannelBase* ACE_Time_Value* time_val )功能:调用svc_factory生成服务渠道性能:输人项:SvcChannelFactory*svc_factory渠道工厂ACE_Time_Value*time_val超时时间这个超时目前是一个固定值,和接收数据和发送数据的超时无直接联系ChannelBase*
15、 !=NULL未取得=NULL取得输出项:返回值注释:出错信息在该方法中输出流程中只判断是否取得,没有取得则应该跳到开头进入下一次循环测试:对所有的可能生成的ChannelBase都进行一次测试5.2.4.6 程序描述TradeRecvDataSINT32 TradeRecvData(Trade* p_recv_trade , ChannelBase* p_chnbase , DataBus* p_databus , ACE_Time_Value* time_out )功能:商家通过渠道接收数据放入p_databus中输人项:ChannelBase* p_chnbase收取的渠道Trade*
16、p_recv_trade接收的商家DataBus* p_databus存放数据的DataBusACE_Time_Value* time_out超时时间输出项:0 成功-1读取失败或者超时注释:主流程不记录详细出错信息5.2.4.7 程序描述TradeInProcessSINT32 TradeInProcess(Trade* p_trade , DataBus* p_databus )功能:执行商家的入口处理(识别,解包。)p_databus的_data_buff 和 _len 字段分别表示数据指针和长度输入处理后将数据填入 p_databus 的 _var_pool 和 _var_reco_p
17、ool(识别数据)中输人项:Trade* p_ trade接收服务商家DataBus* p_databus存放数据的DataBus输出项:0成功-1读取失败或者超时注释:没有超时限制,要控制短时间内完成5.2.4.8 程序描述RequestSecureFailedProcessSINT32 RequestSecureFailedProcess(DataBus* p_databus , Trade* p_trade , ChannelBase* in_svc_channel)功能:对输入是请求报文的安全类函数失败后的处理(输入是应答报文的就直接丢弃)输人项:DataBus* p_databus数
18、据Trade* p_trade输入服务商家ChannelBase* in_svc_channel输入服务的渠道输出项:S_OK应答保报文,不加理会INTIDENERROR( SECUFAILED )请求报文,执行安全异常处理模式成功其他。请求报文,执行安全异常处理模式中出错注释:无论SecureFailedProcess 的执行结果如何都不继续执行后面的操作5.2.4.9 程序描述ExecPatternSINT32 ExecPattern(ProcessPattern * pattern , DataBus* p_databus , ChannelBase* p_channel)功能:执行处理
19、模式,全部处理交给pattern输人项:ProcessPattern* pattern处理模式DataBus* p_databus存放数据的数据总线ChannelBase* channel输入服务渠道,交给Pattern管理释放输出项:S_OK成功其他失败注释: ChannelBase* 输入渠道,如果Pattern没有生成等错误,还是主控来释放p_channel执行pattern-Process 后就不管了可能设置一个标志位来表示是否执行了Pattern,执行过最后就不用释放channel了(是否可以这样?SINT32 ExecPattern(ProcessPattern * pattern
20、 , DataBus* p_databus , ChannelBase* p_channel)主程序都删除p_channel,但是ExecPattern有可能返回的p_channel 是NULL。此时的主控是什么都不做。如果非null就删除)5.3 PatternNewSyncAsyncInnerDir同异步向内处理模式5.3.1 类图5.3.2 描述预先了解:交换平台接入的是服务商家,发送的是主机商家(主机)PatternNewSyncAsyncInnerDir 继承 ProcessPattern 类5.3.3 流程图见下页执行主机商家的输出处理主机商家服务商家接口平台CallHost接口平
21、台主机商家是否同步返回Yes服务商家的输出处理(OutProcess),生成输出数据是否服务商家读写渠道相同是否服务商家读写渠道相同创建ClientInfo,记录当前的信息。失败则转出错处理(不大可能)ClientInfo-channel=输入渠道channel=NULL后续不释放channelClientInfo.channel=NULL释放channelchannel=NULL释放channelchannel = NULL创建新的write_channelwrite_channel = channelchannel=NULL通过write_channel返回数据释放write_channe
22、lYesNoYes释放!=NULL的channel处理完成返回S_OK记录到ClientInfoTableNotpcall出错,记录错误释放!=NULL的渠道返回错误码出错释放使用的通道服务商家的读入渠道channel通过后台返回的fml变量S_TX_STATUS来判断5.3.4 类说明5.3.4.1 构造函数PatternNewSyncAsyncInnerDirPatternNewSyncAsyncInnerDir(Trade * svc_trade ,Trade *host_trade );svc_trade 和 host_trade 分别代表服务商家和主机商家5.3.4.2 方法Proc
23、essSINT32 Process(DataBus * p_databus , ChannelBase* p_channel , ACE_Time_Value * time_val) ;DataBus * p_databus数据总线,包含了解包解开的数据 (FML格式)ChannelBase* p_inchannel服务商家接入的渠道ACE_Time_Value * time_val超时时间这样我们就拥有了处理需要的全部信息。而其他缺少的是在执行中生成的信息了服务商家svc_trade接口平台主机商家host_trade接入渠道是否生成返回渠道由is_same_rw_channel来判断如果读
24、写渠道相同则使用原来的接入渠道原路返回,不用生成服务商家主机商家接口平台该主机通道和上图的返回渠道可能是不同的路线比如是TUX和IPC Queue2种5.3.4.3 程序描述TradeOutProcessSINT32 TradeOutProcess( Trade* p_trade , DataBus* p_databus )功能:执行商家输出处理将数据处理(打包,加密。)处理到发送前的状态输人项:Trade* p_trade 商家DataBus* p_databus数据总线输出项:S_OK成功其他失败注释:5.3.4.4 程序描述CallHostSINT32 CallHost( Trade*
25、p_hst_trade , DataBus* p_databus )输人项:Trade* p_ hst_trade 主机商家DataBus* p_databus数据总线输出项:S_OK成功其他失败注释:实际上是封装了一次发送接收的处理在这个模式里并不考虑单发无返回的情况,全部是发送后等待返回的情况功能:执行和主机商家的一次交互。执行的流程如下:创建主机商家发送的主机通道,发送数据if(读写不是同一条通道)释放发送主机通道设置发送主机通道为NULL创建主机商家接收的主机通道接收数据释放接收的主机商家通道,在此过程中所有生成的通讯渠道都要负责清除失败情况分析:ChannelBase*send_ch
26、annel=NULL;ChannelBase*recv_channel =NULL创建主机商家发送的主机通道失败问题:当tuxedo出错的时候的处理如何进行回答: 在目前的情况下,主机服务渠道实际上是tpcall后台,渠道实现中控制了该渠道的发送接收必然返回同步成功,如果通讯失败,由该主机生成返回码,复制请求数据到返回数据中返回码的生成是设置交易状态为同步返回S_TX_STATUS = 1 , 设置响应码S_RSP_CD 为“2023”设置响应码描述信息S_RSP_DESC 为“调用后台服务错误”交易或者通讯(tpcall)的失败由返回标志位和返回码来确定可能发生情况:1. 同步失败可细分为通
27、讯失败和后台处理返回失败(问题中的情况)2. 同步成功同步执行完毕3. 异步已发送异步处理,已经成功发送S_TX_STATUS = 05.3.4.5 程序描述TradeInProcessSINT32 TradeInProcess(Trade* p_trade , DataBus* p_databus )功能:执行主机商家的输入处理执行主机商家的对应操作,将p_databus中的原始数据识别出接口信息,转换成FML数据存放在p_databus的_var_pool和_var_reco_pool中输人项:Trade* p_ hst_trade 主机商家DataBus* p_databus数据总线输出
28、项:S_OK成功其他失败注释:5.3.4.6 程序描述is_sync_returnbool is_sync_return(DataBus* p_databus )功能:查看p_databus,判断这次返回是否是同步返回输人项:DataBus* p_databus数据总线输出项:true同步返回false异步返回注释:服务商家接口平台主机商家接入渠道是否生成返回渠道由is_same_rw_channel来判断如果读写用相同的渠道返回则使用原来的接入渠道,不用生成5.3.4.7 程序描述is_same_rw_svcchannelbool is_same_rw_svcchannel ( Trade*
29、 p_trade )功能:查看该商家是否在同一链路上返回请求根据商家查看该商家的服务渠道定义查询如果没有定义了商家写的渠道,则表明读写渠道是一样的如果定义了商家写的渠道,则表明读写渠道是不同的输人项:Trade* p_trade服务商家输出项:true是false不是注释:通过查看商家的读写渠道是否相同,可以在处理前明白是否可以提前释放读的渠道返回给商家的时候明白是否要生成新的写的渠道5.3.4.8 程序描述createClientInfoClientInfo* createClientInfo( DataBus* p_databus , ChannelBase* p_channel ) 功能
30、:创建一项异步返回的客户端连接记录无论p_channel是否=NULL,都填入新建的ClientInfo 中输人项:DataBus* p_databus ChannelBase* p_channel返回的渠道只有读写原路返回的才!=NULL如果写要重新创建的填NULL可以的话用ACE_ASSERT判断一下输出项:ClientInfo*客户连接记录!=NULL成功=NULL不大可能注释:5.3.4.9 程序描述addToClientInfoTablevoid addToClientInfoTable( string key , ClientInfo* info )功能:创建一项异步返回的客户端连
31、接记录输人项:string key键值目前是由ClientInfoTable的generateKey(p_databus : DataBus*)生成ClientInfo* info记录输出项:ClientInfo*客户连接记录注释:5.4 ThreadReplySvcProcessor异步应答返回处理器5.4.1 类图5.4.2 类说明5.4.2.1 程序描述ThreadReplySvcProcessorThreadReplySvcProcessor (Trade* ptrade , SvcChannelFactory* pfactory, bool*_bexit)功能:构造函数性能:输人项:
32、Trade* trade接收返回数据处理的商家类服务商家,对于ATM接口就是ATM服务商家SvcChannelFactory* pfactory接收返回数据渠道工厂bool* exit退出标志输出项:注释:主机商家服务商家接口平台异步返回这里的服务商家就是存放在ClientInfo记录中的商家代码(trade_code)对应的服务商家,要根据trade_code来动态生成和释放5.4.2.2 程序描述SvcRunvoid SvcRun()主流程功能:接收主机商家异步交易返回的数据并向服务商家发送的输人项:无输出项:无流程:生成接收主机商家DataBus初始化循环处理SINT32 ret = a
33、_process_loop (ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus );清空DataBus,以便下次重复使用if( 退出标志被设置 并且 渠道返回获得渠道收数为超时 )跳出循环收尾处理,释放recv_trade注释:单次处理的方法在a_loop_process中实现5.4.2.3 程序描述a_process_loopSINT32 a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus )功能:一次交易的处理输人项:Trade
34、* pTrade 将应答数据返回对应的商家(对于ATM接口就是ATMC对应的那个)SvcChannelFactory* pFactory主机商家接收数据的主机通道 异步应答渠道的生成工厂DataBus* pDataBus预先创建的数据总线,不需要每次重建输出项:S_OK成功完成其他出错信息流程设置主机商家接收通道和服务商家返回渠道,返回的服务商家为NULLChannelBase* recvChannel = NULL;ChannelBase* returnChannel = NULL;Trade* svcChannel = NULL;先执行 GetRecvChannel取得接收数据的渠道( C
35、hannelBase* ),取不到则直接跳到最后的出错处理然后执行TradeRecvDataRecvReplyData收数据放入DataBus的_databuff , 长度放入_len收完数据可以释放recvChannel,recvChannel=NULL然后执行UnpackRecvData 解开数据执行UnpackRecvData将数据解开为FML Buffer然后调用 ClientInfoTable 的 generateKey方法生成键值然后调用fetchClientInfoRecord取得记录 ClientInfoRecord*然后RecoverDataBusInfo调用恢复返回前的Da
36、taBus信息然后根据ClientInfoRecord* record 的 trade_code中 调用GetTrade取得要返回信息的服务商家 Trade*然后调用TradeOutProcess生成对服务商家发送的数据然后判断是否要生成返回渠道ChannelBase* return_channel = clientinfo.channel;clientinfo.channel = NULL;/释放和clientInfo的联系if( return_channel = NULL )创建return_channel = CreateOutputChannel创建失败,转入出错处理调用TradeSe
37、ndData 向服务商家发送数据,失败转入出错处理释放return_channel return_channel=NULL释放svc_trade svc_trade=NULL出错处理:记录错误如果收发渠道 !=NULL释放收发渠道结束处理:如果 svc_trade!=NULL释放svc_trade注释:为了便于单元测试,从SvcRun中分离出该方法也可以在SvcRun中实现上述的全部逻辑可以单元测试 正常处理 以及 取渠道超时,输入处理失败,生成服务商家写渠道失败等情况问题:是否真的有助于单元测试?5.4.2.4 程序描述GetRecvChannelChannelBase* GetRecvCh
38、annel(Trade* p_recv_trade )功能:根据商家取得接收的渠道输人项:Trade*p_recv_trade接收的商家输出项:ChannelBase*!=NULL取到=NULL没有取到注释:5.4.2.5 程序描述TradeRecvData (建议改为RecvReplyData)SINT32 TradeRecvDataRecvReplyData( ChannelBase* p_chnbase , Trade* p_trade , DataBus* p_databus , ACE_Time_Value* p_timeout ) 功能:从商家收取数据输人项:ChannelBase
39、* p_chnbase渠道(定义了数据收取方式)Trade* p_trade商家(商家收取数据的格式可能不同) (不可能存在不同的情况)DataBus* p_datrabus数据总线,收取数据存放地ACE_Time_Value* p_timeout超时时间输出项:S_OK成功其它失败注释:5.4.2.6 程序描述UnpackRecvDataSINT32 UnpackRecvData (DataBus* p_databus )功能:解开p_databus中的数据(_data_buff,_len),放入_var_pool输人项:DataBus* p_databus输出项:S_OK成功其它失败注释:
40、5.4.2.7 程序描述fetchClientInfoRecordClientInfo* fetchClientInfoRecord(string key) 功能:从ClientInfoTable中查找客户端连接信息输人项:string key键值输出项:!=NULL找到=NULL没找到注释:key是由ClientInfoTable 的generateKey(p_databus : DataBus*)方法生成的5.4.2.8 程序描述RecoverDataBusInfoSINT32 RecoverDataBusInfo(ClientInfo* p_clientinfo_record , Dat
41、aBus* p_databus ) 功能:从ClientInfo*信息中恢复出原来的DataBus信息输人项:string key键值输出项:!=NULL找到=NULL没找到注释:问题:原来的InProcess以后DataBus的数据怎么办?这里很容易出错,要单元测试5.4.2.9 程序描述getTradeTrade* getTrade( string trade_code ) 功能:生成商家输人项:string trade_code输出项:!=NULL找到=NULL没找到注释:5.4.2.10 程序描述TradeOutProcessSINT32 TradeOutProcess( Trade*
42、 p_trade, DataBus* p_databus ) 功能:执行商家的对外数据处理输人项:Trade* p_tradeDataBus* p_databus输出项:S_OK成功其他失败注释:5.4.2.11 程序描述CreateOutputChannelChannelBase* CreateOutputChannel( Trade* out_trade ) 功能:创建输出的渠道输人项:Trade* p_trade输出项:ChannelBase !=NULL成功=NULL失败注释:在读写渠道不同的情况下被调用生成写的渠道5.4.2.12 程序描述TradeSendDataSINT32 Tr
43、adeSendData(p_trade : Trade*, p_databus : DataBus*) 功能:调用商家方法发送数据总线中的数据输人项:Trade* p_tradeDataBus* p_databus输出项:S_OK成功其他失败注释:5.5 ClientInfo客户端连接数据5.5.1 类图5.5.2 类描述类描述存放客户端连接数据和服务渠道数据 成员描述begin_time开始放入的时间timeout_time预计超时时间(接口处理中有超时时间指定,不过目前基本都没指定)trade_code商家代码interface_id接口编号pkggrp_id报文组号pkg_idx报文序号5.6 ClientInfoTable客户端连接数据表5.6.1 类图5.6.2 类描述功能:n 存取客户端ClientInfoTable连接数据n 生成存取键值n 定时清除超时的记录5.6.2.1 程序描述getInstance()ClientInfoTable* getInsta