版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上接口詳細(xì)設(shè)計(jì)文檔作者:唐為(為哥)審核:趙錕日期:2005-5-271 編寫目的預(yù)期讀者:對(duì)接口行為和目的有一定了解的人背景說明n 軟件系統(tǒng)名稱:接口前端接入服務(wù)器n 描述 <接口> 接收不同商家的接入,接收數(shù)據(jù)轉(zhuǎn)發(fā)給主機(jī)服務(wù)器,并同步/異步將返回?cái)?shù)據(jù)發(fā)給接入商家的行為2 名詞解釋n ChannelBase渠道,通信基類,提供數(shù)據(jù)收發(fā)和釋放的方法接口用子類實(shí)現(xiàn)來封裝了不同通信方式 目前有TCP短連接接入, 從ACE Message_Queue中讀取(IPC MessageQueue-> ACE_Message_Queue)n Trade* trade
2、商家對(duì)象,代表的其實(shí)是針對(duì)該商家處理方法的集合將接入數(shù)據(jù)的商家稱為服務(wù)商家而將請(qǐng)求面向的商家稱為主機(jī)商家,主機(jī)商家負(fù)責(zé)同步/異步返回交易的應(yīng)答數(shù)據(jù)給接口平臺(tái)n 而接口(數(shù)據(jù)交換)平臺(tái)是在兩者之間的交換平臺(tái)n 渠道工廠:把接入數(shù)據(jù)的渠道工廠統(tǒng)一定為服務(wù)渠道工廠,發(fā)送數(shù)據(jù)的渠道工廠統(tǒng)一定為主機(jī)通道工廠服務(wù)商家接口平臺(tái)主機(jī)商家查不到,丟棄返回應(yīng)答線程組ATM接入服務(wù)器ATM連接隊(duì)列TCP渠道IPC消息隊(duì)列渠道commserverIPC消息隊(duì)列注各種服務(wù)渠道和主機(jī)通道抽象類都是相同的基類ChannelBase,只是作用不同渠道工廠生成各種渠道IPC消息隊(duì)列commserver銀聯(lián)接入服務(wù)渠道抽象代表各
3、種接入服務(wù)渠道接出服務(wù)渠道抽象TCP渠道IPC消息隊(duì)列渠道發(fā)送請(qǐng)求線程組后臺(tái)服務(wù)器連接監(jiān)視器IPC消息隊(duì)列通知清除超時(shí)間連接記錄表接收線程接收IPC消息總控接入主機(jī)通道抽象IPC消息隊(duì)列渠道3 組件分布圖ATM4 程序結(jié)構(gòu)4.1 接入處理線程類圖PatternNewSyncAsyncInnerDir是ProcessPattern的一個(gè)子類,實(shí)現(xiàn)發(fā)送主機(jī)服務(wù)器并判斷同/異步返回同步直接返回給接入商家異步只做相應(yīng)記錄ProcessPattern是后續(xù)處理的全部流程抽象類子類實(shí)現(xiàn)對(duì)應(yīng)不同流程ThreadInSvcProcessor是接入處理線程的主流程收數(shù),接包無誤后將處理控制權(quán)交給ProcessP
4、attern4.2 接收線程類圖4.3 啟動(dòng)控制圖5 程序設(shè)計(jì)說明5.1 對(duì)原系統(tǒng)的改動(dòng)n 改變?cè)猩碳襎rade類,不存放渠道對(duì)象在商家類中,商家類只執(zhí)行商家處理,不負(fù)責(zé)渠道的管理n 改動(dòng)原有的系統(tǒng)中所有模式的處理,模式處理必須對(duì)渠道的釋放負(fù)責(zé)n 修改MidHstChannel,添加后臺(tái)服務(wù)需要的個(gè)FML字段,這兩個(gè)字段是:FML域名描述S_INTERF_NO接口標(biāo)識(shí)號(hào),整數(shù)。系統(tǒng)中接收異步響應(yīng)程序的唯一編號(hào)。用于標(biāo)識(shí)請(qǐng)求的來源,異步應(yīng)答根據(jù)這個(gè)號(hào)碼分發(fā)給具體的接口程序。S_TX_CTRL_ATTR交易控制屬性,字符串。接口都填0,表示這是正常的交易請(qǐng)求。5.2 ThreadInSvcPro
5、cessor接入處理器5.2.1 類圖5.2.2 時(shí)序圖預(yù)先說明:n ChannelBase渠道通信基類,提供數(shù)據(jù)收發(fā)和釋放的方法接口用子類實(shí)現(xiàn)來封裝了不同通信方式。目前有 TCP短連接接入。從ACE Message_Queue中讀取(IPC MessageQueue-> ACE_Message_Queue)n Trade* trade商家:代表的其實(shí)是針對(duì)該商家處理方法的集合5.2.3 流程圖服務(wù)商家商家渠道工廠GetChannel商家通過渠道收取數(shù)據(jù)商家的輸入處理渠道沒取到退出?超時(shí)?安全出錯(cuò)?請(qǐng)求:執(zhí)行安全出錯(cuò)模式PatternErrorSyncInner處理模式請(qǐng)求/應(yīng)答YesN
6、o執(zhí)行識(shí)別出的模式處理Yes同異步模式PatternNewSyncASyncInnerDirPatternASyncInnerDir應(yīng)答丟棄5.2.4 ThreadInSvcProcessor類說明 功能收取用不同渠道接入的外部商家的請(qǐng)求識(shí)別,解包執(zhí)行處理的模式具體的流程在模式中控制,并不做控制模式可能有3種:1. 無返回:發(fā)送后臺(tái),不接收應(yīng)答對(duì)應(yīng)模式PatternASyncInnerDir,需要修改原來的相關(guān)程序,在本文檔中并不涉及2. 有返回,根據(jù)返回的應(yīng)答判斷是同步返回還是異步返回如果接收的應(yīng)答表明是同步返回,按正常模式返回如果接收的應(yīng)答表明是異步返回,按異步模式處理對(duì)應(yīng)模
7、式PatternNewSyncASyncInnerDirThreadInSvcProcessor后續(xù)的ProcessPattern 應(yīng)該是PatternNewSyncASyncInnerDir.ThreadInSvcProcessor只負(fù)責(zé)接入后調(diào)用模式,并處理異常情況3. 安全異常情況的模式下,調(diào)用模式PatternErrorSyncInner來處理,必須限制:主要的改動(dòng)是渠道的釋放由模式來管理涉及模式有 PatternASyncInnerDir , PatternNewSyncASyncInnerDir , PatternErrorSyncInner (可能不全面) 程序描述
8、ThreadInSvcProcessorThreadInSvcProcessor(Trade* ptrade , SvcChannelFactory* pfactory, bool*_bexit)功能:構(gòu)造函數(shù)性能:輸人項(xiàng):Trade* trade接入數(shù)據(jù)處理的商家類SvcChannelFactory* pfactory接入數(shù)據(jù)渠道工廠bool* exit退出標(biāo)志輸出項(xiàng):注釋: 程序描述SvcRunvoid SvcRun()功能:主控流程輸人項(xiàng):無輸出項(xiàng):無流程:服務(wù)商家在開始已經(jīng)生成,生存周期里一直存在一個(gè)DataBus對(duì)象(數(shù)據(jù)總線),每線程一個(gè)DataBus對(duì)象。在生存周期
9、里一直存在DataBus對(duì)象初始化循環(huán)處理SINT32 ret = a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus );if(bool* exit = true )釋放渠道跳出循環(huán)為下一次使用清空DataBus對(duì)象收尾處理,釋放recv_trade 程序描述a_process_loopSINT32 a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus )功能:一次交易的處理
10、輸人項(xiàng):Trade* pTrade , 接收數(shù)據(jù)的服務(wù)商家服務(wù)渠道SvcChannelFactory* pFactory,服務(wù)商家接收數(shù)據(jù)的主機(jī)通道SvcChannelFactory * pFactory 服務(wù)商家渠道的生成工廠。DataBus* pDataBus預(yù)先創(chuàng)建的數(shù)據(jù)總線,不需要每次重建輸出項(xiàng):S_OK成功完成其他出錯(cuò)信息流程:依次執(zhí)行GetChannel生成接入渠道ChannelBase* (根據(jù)商家生成一個(gè)ChannelBase的子類)除非出錯(cuò),整個(gè)流程不釋放該ChannelBase , 委托給Patten負(fù)責(zé)釋放TradeRecvData 服務(wù)商家接收數(shù)據(jù)TradeInProc
11、ess服務(wù)商家進(jìn)入處理(最主要一項(xiàng)功能就是接口識(shí)別)If( TradeInProcess 成功 && 安全函數(shù)出錯(cuò) ) /安全函數(shù)一般是mac校驗(yàn)失敗根據(jù)p_databus-> pack_type 對(duì)請(qǐng)求和應(yīng)答作2種不同的處理if( pack_type 是請(qǐng)求 ) 執(zhí)行 RequestSecureFailedProcess 函數(shù)調(diào)用else /應(yīng)答報(bào)文結(jié)果是應(yīng)答 直接丟棄,返回成功不管結(jié)果如何都跳到異常處理,但是返回值可能因SecureFailedProcess的執(zhí)行結(jié)果而不同else否則生成Patern對(duì)象生成對(duì)方商家hst_trade生成模式對(duì)象Pattern,將服務(wù)
12、商家和對(duì)方商家傳入執(zhí)行ExecPattern執(zhí)行具體的模式處理,將渠道委托給Patten負(fù)責(zé)釋放異常處理:記錄出錯(cuò)信息和時(shí)間當(dāng)異常發(fā)生在ExecPattern之外,釋放渠道結(jié)束處理:(無論異常與否都執(zhí)行):釋放對(duì)方商家 st_trade釋放模式對(duì)象Pattern注釋:為了便于單元測(cè)試,從SvcRun中分離出該方法也可以在SvcRun中實(shí)現(xiàn)上述的全部邏輯 程序描述GetChannelSINT32 GetChannel(SvcChannelFactory* factory, ChannelBase* ACE_Time_Value* time_val )功能:調(diào)用svc_factory
13、生成服務(wù)渠道性能:輸人項(xiàng):SvcChannelFactory*svc_factory渠道工廠ACE_Time_Value*time_val超時(shí)時(shí)間這個(gè)超時(shí)目前是一個(gè)固定值,和接收數(shù)據(jù)和發(fā)送數(shù)據(jù)的超時(shí)無直接聯(lián)系ChannelBase* !=NULL未取得=NULL取得輸出項(xiàng):返回值注釋:出錯(cuò)信息在該方法中輸出流程中只判斷是否取得,沒有取得則應(yīng)該跳到開頭進(jìn)入下一次循環(huán)測(cè)試:對(duì)所有的可能生成的ChannelBase都進(jìn)行一次測(cè)試 程序描述TradeRecvDataSINT32 TradeRecvData(Trade* p_recv_trade , ChannelBase* p_chnb
14、ase , DataBus* p_databus , ACE_Time_Value* time_out )功能:商家通過渠道接收數(shù)據(jù)放入p_databus中輸人項(xiàng):ChannelBase* p_chnbase收取的渠道Trade* p_recv_trade接收的商家DataBus* p_databus存放數(shù)據(jù)的DataBusACE_Time_Value* time_out超時(shí)時(shí)間輸出項(xiàng):0 成功-1讀取失敗或者超時(shí)注釋:主流程不記錄詳細(xì)出錯(cuò)信息 程序描述TradeInProcessSINT32 TradeInProcess(Trade* p_trade , DataBus* p_
15、databus )功能:執(zhí)行商家的入口處理(識(shí)別,解包。)p_databus的_data_buff 和 _len 字段分別表示數(shù)據(jù)指針和長(zhǎng)度輸入處理后將數(shù)據(jù)填入 p_databus 的 _var_pool 和 _var_reco_pool(識(shí)別數(shù)據(jù))中輸人項(xiàng):Trade* p_ trade接收服務(wù)商家DataBus* p_databus存放數(shù)據(jù)的DataBus輸出項(xiàng):0成功-1讀取失敗或者超時(shí)注釋:沒有超時(shí)限制,要控制短時(shí)間內(nèi)完成 程序描述RequestSecureFailedProcessSINT32 RequestSecureFailedProcess(DataBus* p_
16、databus , Trade* p_trade , ChannelBase* in_svc_channel)功能:對(duì)輸入是請(qǐng)求報(bào)文的安全類函數(shù)失敗后的處理(輸入是應(yīng)答報(bào)文的就直接丟棄)輸人項(xiàng):DataBus* p_databus數(shù)據(jù)Trade* p_trade輸入服務(wù)商家ChannelBase* in_svc_channel輸入服務(wù)的渠道輸出項(xiàng):S_OK應(yīng)答保報(bào)文,不加理會(huì)INTIDENERROR( SECUFAILED )請(qǐng)求報(bào)文,執(zhí)行安全異常處理模式成功其他。請(qǐng)求報(bào)文,執(zhí)行安全異常處理模式中出錯(cuò)注釋:無論SecureFailedProcess 的執(zhí)行結(jié)果如何都不繼續(xù)執(zhí)行后面的操作5.2.
17、4.9 程序描述ExecPatternSINT32 ExecPattern(ProcessPattern * pattern , DataBus* p_databus , ChannelBase* p_channel)功能:執(zhí)行處理模式,全部處理交給pattern輸人項(xiàng):ProcessPattern* pattern處理模式DataBus* p_databus存放數(shù)據(jù)的數(shù)據(jù)總線ChannelBase* channel輸入服務(wù)渠道,交給Pattern管理釋放輸出項(xiàng):S_OK成功其他失敗注釋: ChannelBase* 輸入渠道,如果Pattern沒有生成等錯(cuò)誤,還是主控來釋放p_channel執(zhí)
18、行pattern->Process 后就不管了可能設(shè)置一個(gè)標(biāo)志位來表示是否執(zhí)行了Pattern,執(zhí)行過最后就不用釋放channel了(是否可以這樣?SINT32 ExecPattern(ProcessPattern * pattern , DataBus* p_databus , ChannelBase* p_channel)主程序都刪除p_channel,但是ExecPattern有可能返回的p_channel 是NULL。此時(shí)的主控是什么都不做。如果非null就刪除)5.3 PatternNewSyncAsyncInnerDir同異步向內(nèi)處理模式5.3.1 類圖5.3.2 描述預(yù)先了
19、解:交換平臺(tái)接入的是服務(wù)商家,發(fā)送的是主機(jī)商家(主機(jī))PatternNewSyncAsyncInnerDir 繼承 ProcessPattern 類5.3.3 流程圖見下頁執(zhí)行主機(jī)商家的輸出處理主機(jī)商家服務(wù)商家接口平臺(tái)CallHost接口平臺(tái)主機(jī)商家是否同步返回Yes服務(wù)商家的輸出處理(OutProcess),生成輸出數(shù)據(jù)是否服務(wù)商家讀寫渠道相同是否服務(wù)商家讀寫渠道相同創(chuàng)建ClientInfo,記錄當(dāng)前的信息。失敗則轉(zhuǎn)出錯(cuò)處理(不大可能)ClientInfo->channel=輸入渠道channel=NULL后續(xù)不釋放channelClientInfo.channel=NULL釋放cha
20、nnelchannel=NULL釋放channelchannel = NULL創(chuàng)建新的write_channelwrite_channel = channelchannel=NULL通過write_channel返回?cái)?shù)據(jù)釋放write_channelYesNoYes釋放!=NULL的channel處理完成返回S_OK記錄到ClientInfoTableNotpcall出錯(cuò),記錄錯(cuò)誤釋放!=NULL的渠道返回錯(cuò)誤碼出錯(cuò)釋放使用的通道服務(wù)商家的讀入渠道channel通過后臺(tái)返回的fml變量S_TX_STATUS來判斷5.3.4 類說明 構(gòu)造函數(shù)PatternNewSyncAsyncI
21、nnerDirPatternNewSyncAsyncInnerDir(Trade * svc_trade ,Trade *host_trade );svc_trade 和 host_trade 分別代表服務(wù)商家和主機(jī)商家 方法ProcessSINT32 Process(DataBus * p_databus , ChannelBase* p_channel , ACE_Time_Value * time_val) ;DataBus * p_databus數(shù)據(jù)總線,包含了解包解開的數(shù)據(jù) (FML格式)ChannelBase* p_inchannel服務(wù)商家接入的渠道ACE_Time
22、_Value * time_val超時(shí)時(shí)間這樣我們就擁有了處理需要的全部信息。而其他缺少的是在執(zhí)行中生成的信息了服務(wù)商家svc_trade接口平臺(tái)主機(jī)商家host_trade接入渠道是否生成返回渠道由is_same_rw_channel來判斷如果讀寫渠道相同則使用原來的接入渠道原路返回,不用生成服務(wù)商家主機(jī)商家接口平臺(tái)該主機(jī)通道和上圖的返回渠道可能是不同的路線比如是TUX和IPC Queue2種 程序描述TradeOutProcessSINT32 TradeOutProcess( Trade* p_trade , DataBus* p_databus )功能:執(zhí)行商家輸出處理將數(shù)
23、據(jù)處理(打包,加密。)處理到發(fā)送前的狀態(tài)輸人項(xiàng):Trade* p_trade 商家DataBus* p_databus數(shù)據(jù)總線輸出項(xiàng):S_OK成功其他失敗注釋: 程序描述CallHostSINT32 CallHost( Trade* p_hst_trade , DataBus* p_databus )輸人項(xiàng):Trade* p_ hst_trade 主機(jī)商家DataBus* p_databus數(shù)據(jù)總線輸出項(xiàng):S_OK成功其他失敗注釋:實(shí)際上是封裝了一次發(fā)送接收的處理在這個(gè)模式里并不考慮單發(fā)無返回的情況,全部是發(fā)送后等待返回的情況功能:執(zhí)行和主機(jī)商家的一次交互。執(zhí)行的流程如下:創(chuàng)建主
24、機(jī)商家發(fā)送的主機(jī)通道,發(fā)送數(shù)據(jù)if(讀寫不是同一條通道)釋放發(fā)送主機(jī)通道設(shè)置發(fā)送主機(jī)通道為NULL創(chuàng)建主機(jī)商家接收的主機(jī)通道接收數(shù)據(jù)釋放接收的主機(jī)商家通道,在此過程中所有生成的通訊渠道都要負(fù)責(zé)清除失敗情況分析:ChannelBase*send_channel=NULL;ChannelBase*recv_channel =NULL創(chuàng)建主機(jī)商家發(fā)送的主機(jī)通道失敗問題:當(dāng)tuxedo出錯(cuò)的時(shí)候的處理如何進(jìn)行回答: 在目前的情況下,主機(jī)服務(wù)渠道實(shí)際上是tpcall后臺(tái),渠道實(shí)現(xiàn)中控制了該渠道的發(fā)送接收必然返回同步成功,如果通訊失敗,由該主機(jī)生成返回碼,復(fù)制請(qǐng)求數(shù)據(jù)到返回?cái)?shù)據(jù)中返回碼的生成是設(shè)置交易狀態(tài)
25、為同步返回S_TX_STATUS = 1 , 設(shè)置響應(yīng)碼S_RSP_CD 為“2023”設(shè)置響應(yīng)碼描述信息S_RSP_DESC 為“調(diào)用后臺(tái)服務(wù)錯(cuò)誤”交易或者通訊(tpcall)的失敗由返回標(biāo)志位和返回碼來確定可能發(fā)生情況:1. 同步失敗可細(xì)分為通訊失敗和后臺(tái)處理返回失敗(問題中的情況)2. 同步成功同步執(zhí)行完畢3. 異步已發(fā)送異步處理,已經(jīng)成功發(fā)送S_TX_STATUS = 0 程序描述TradeInProcessSINT32 TradeInProcess(Trade* p_trade , DataBus* p_databus )功能:執(zhí)行主機(jī)商家的輸入處理執(zhí)行主機(jī)商家的對(duì)應(yīng)操
26、作,將p_databus中的原始數(shù)據(jù)識(shí)別出接口信息,轉(zhuǎn)換成FML數(shù)據(jù)存放在p_databus的_var_pool和_var_reco_pool中輸人項(xiàng):Trade* p_ hst_trade 主機(jī)商家DataBus* p_databus數(shù)據(jù)總線輸出項(xiàng):S_OK成功其他失敗注釋: 程序描述is_sync_returnbool is_sync_return(DataBus* p_databus )功能:查看p_databus,判斷這次返回是否是同步返回輸人項(xiàng):DataBus* p_databus數(shù)據(jù)總線輸出項(xiàng):true同步返回false異步返回注釋:服務(wù)商家接口平臺(tái)主機(jī)商家接入渠道是
27、否生成返回渠道由is_same_rw_channel來判斷如果讀寫用相同的渠道返回則使用原來的接入渠道,不用生成 程序描述is_same_rw_svcchannelbool is_same_rw_svcchannel ( Trade* p_trade )功能:查看該商家是否在同一鏈路上返回請(qǐng)求根據(jù)商家查看該商家的服務(wù)渠道定義查詢?nèi)绻麤]有定義了商家寫的渠道,則表明讀寫渠道是一樣的如果定義了商家寫的渠道,則表明讀寫渠道是不同的輸人項(xiàng):Trade* p_trade服務(wù)商家輸出項(xiàng):true是false不是注釋:通過查看商家的讀寫渠道是否相同,可以在處理前明白是否可以提前釋放讀的渠道返回給
28、商家的時(shí)候明白是否要生成新的寫的渠道 程序描述createClientInfoClientInfo* createClientInfo( DataBus* p_databus , ChannelBase* p_channel ) 功能:創(chuàng)建一項(xiàng)異步返回的客戶端連接記錄無論p_channel是否=NULL,都填入新建的ClientInfo 中輸人項(xiàng):DataBus* p_databus ChannelBase* p_channel返回的渠道只有讀寫原路返回的才!=NULL如果寫要重新創(chuàng)建的填NULL可以的話用ACE_ASSERT判斷一下輸出項(xiàng):ClientInfo*客戶連接記錄!=
29、NULL成功=NULL不大可能注釋: 程序描述addToClientInfoTablevoid addToClientInfoTable( string key , ClientInfo* info )功能:創(chuàng)建一項(xiàng)異步返回的客戶端連接記錄輸人項(xiàng):string key鍵值目前是由ClientInfoTable的generateKey(p_databus : DataBus*)生成ClientInfo* info記錄輸出項(xiàng):ClientInfo*客戶連接記錄注釋:5.4 ThreadReplySvcProcessor異步應(yīng)答返回處理器5.4.1 類圖5.4.2 類說明
30、 程序描述ThreadReplySvcProcessorThreadReplySvcProcessor (Trade* ptrade , SvcChannelFactory* pfactory, bool*_bexit)功能:構(gòu)造函數(shù)性能:輸人項(xiàng):Trade* trade接收返回?cái)?shù)據(jù)處理的商家類服務(wù)商家,對(duì)于ATM接口就是ATM服務(wù)商家SvcChannelFactory* pfactory接收返回?cái)?shù)據(jù)渠道工廠bool* exit退出標(biāo)志輸出項(xiàng):注釋:主機(jī)商家服務(wù)商家接口平臺(tái)異步返回這里的服務(wù)商家就是存放在ClientInfo記錄中的商家代碼(trade_code)對(duì)應(yīng)的服務(wù)商家,要根據(jù)trad
31、e_code來動(dòng)態(tài)生成和釋放 程序描述SvcRunvoid SvcRun()主流程功能:接收主機(jī)商家異步交易返回的數(shù)據(jù)并向服務(wù)商家發(fā)送的輸人項(xiàng):無輸出項(xiàng):無流程:生成接收主機(jī)商家DataBus初始化循環(huán)處理SINT32 ret = a_process_loop (ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus );清空DataBus,以便下次重復(fù)使用if( 退出標(biāo)志被設(shè)置 并且 渠道返回獲得渠道收數(shù)為超時(shí) )跳出循環(huán)收尾處理,釋放recv_trade注釋:單次處理的方法在a_loop_process中實(shí)現(xiàn)
32、 程序描述a_process_loopSINT32 a_process_loop (Trade* ptrade , SvcChannelFactory* pfactory,DataBus* pDataBus )功能:一次交易的處理輸人項(xiàng):Trade* pTrade 將應(yīng)答數(shù)據(jù)返回對(duì)應(yīng)的商家(對(duì)于ATM接口就是ATMC對(duì)應(yīng)的那個(gè))SvcChannelFactory* pFactory主機(jī)商家接收數(shù)據(jù)的主機(jī)通道 異步應(yīng)答渠道的生成工廠DataBus* pDataBus預(yù)先創(chuàng)建的數(shù)據(jù)總線,不需要每次重建輸出項(xiàng):S_OK成功完成其他出錯(cuò)信息流程設(shè)置主機(jī)商家接收通道和服務(wù)商家返回渠道,返回的服務(wù)商家為N
33、ULLChannelBase* recvChannel = NULL;ChannelBase* returnChannel = NULL;Trade* svcChannel = NULL;先執(zhí)行 GetRecvChannel取得接收數(shù)據(jù)的渠道( ChannelBase* ),取不到則直接跳到最后的出錯(cuò)處理然后執(zhí)行TradeRecvDataRecvReplyData收數(shù)據(jù)放入DataBus的_databuff , 長(zhǎng)度放入_len收完數(shù)據(jù)可以釋放recvChannel,recvChannel=NULL然后執(zhí)行UnpackRecvData 解開數(shù)據(jù)執(zhí)行UnpackRecvData將數(shù)據(jù)解開為FML
34、 Buffer然后調(diào)用 ClientInfoTable 的 generateKey方法生成鍵值然后調(diào)用fetchClientInfoRecord取得記錄 ClientInfoRecord*然后RecoverDataBusInfo調(diào)用恢復(fù)返回前的DataBus信息然后根據(jù)ClientInfoRecord* record 的 trade_code中 調(diào)用GetTrade取得要返回信息的服務(wù)商家 Trade*然后調(diào)用TradeOutProcess生成對(duì)服務(wù)商家發(fā)送的數(shù)據(jù)然后判斷是否要生成返回渠道ChannelBase* return_channel = clientinfo.channel;clie
35、ntinfo.channel = NULL;/釋放和clientInfo的聯(lián)系if( return_channel = NULL )創(chuàng)建return_channel = CreateOutputChannel創(chuàng)建失敗,轉(zhuǎn)入出錯(cuò)處理調(diào)用TradeSendData 向服務(wù)商家發(fā)送數(shù)據(jù),失敗轉(zhuǎn)入出錯(cuò)處理釋放return_channel return_channel=NULL釋放svc_trade svc_trade=NULL出錯(cuò)處理:記錄錯(cuò)誤如果收發(fā)渠道 !=NULL釋放收發(fā)渠道結(jié)束處理:如果 svc_trade!=NULL釋放svc_trade注釋:為了便于單元測(cè)試,從SvcRun中分離出該方法也
36、可以在SvcRun中實(shí)現(xiàn)上述的全部邏輯可以單元測(cè)試 正常處理 以及 取渠道超時(shí),輸入處理失敗,生成服務(wù)商家寫渠道失敗等情況問題:是否真的有助于單元測(cè)試? 程序描述GetRecvChannelChannelBase* GetRecvChannel(Trade* p_recv_trade )功能:根據(jù)商家取得接收的渠道輸人項(xiàng):Trade*p_recv_trade接收的商家輸出項(xiàng):ChannelBase*!=NULL取到=NULL沒有取到注釋: 程序描述TradeRecvData (建議改為RecvReplyData)SINT32 TradeRecvDataRecvRep
37、lyData( ChannelBase* p_chnbase , Trade* p_trade , DataBus* p_databus , ACE_Time_Value* p_timeout ) 功能:從商家收取數(shù)據(jù)輸人項(xiàng):ChannelBase* p_chnbase渠道(定義了數(shù)據(jù)收取方式)Trade* p_trade商家(商家收取數(shù)據(jù)的格式可能不同) (不可能存在不同的情況)DataBus* p_datrabus數(shù)據(jù)總線,收取數(shù)據(jù)存放地ACE_Time_Value* p_timeout超時(shí)時(shí)間輸出項(xiàng):S_OK成功其它失敗注釋: 程序描述UnpackRecvDataSINT3
38、2 UnpackRecvData (DataBus* p_databus )功能:解開p_databus中的數(shù)據(jù)(_data_buff,_len),放入_var_pool輸人項(xiàng):DataBus* p_databus輸出項(xiàng):S_OK成功其它失敗注釋: 程序描述fetchClientInfoRecordClientInfo* fetchClientInfoRecord(string key) 功能:從ClientInfoTable中查找客戶端連接信息輸人項(xiàng):string key鍵值輸出項(xiàng):!=NULL找到=NULL沒找到注釋:key是由ClientInfoTable 的generat
39、eKey(p_databus : DataBus*)方法生成的 程序描述RecoverDataBusInfoSINT32 RecoverDataBusInfo(ClientInfo* p_clientinfo_record , DataBus* p_databus ) 功能:從ClientInfo*信息中恢復(fù)出原來的DataBus信息輸人項(xiàng):string key鍵值輸出項(xiàng):!=NULL找到=NULL沒找到注釋:問題:原來的InProcess以后DataBus的數(shù)據(jù)怎么辦?這里很容易出錯(cuò),要單元測(cè)試 程序描述getTradeTrade* getTrade( strin
40、g trade_code ) 功能:生成商家輸人項(xiàng):string trade_code輸出項(xiàng):!=NULL找到=NULL沒找到注釋:0 程序描述TradeOutProcessSINT32 TradeOutProcess( Trade* p_trade, DataBus* p_databus ) 功能:執(zhí)行商家的對(duì)外數(shù)據(jù)處理輸人項(xiàng):Trade* p_tradeDataBus* p_databus輸出項(xiàng):S_OK成功其他失敗注釋:1 程序描述CreateOutputChannelChannelBase* CreateOutputChannel( Trade* out_t
41、rade ) 功能:創(chuàng)建輸出的渠道輸人項(xiàng):Trade* p_trade輸出項(xiàng):ChannelBase !=NULL成功=NULL失敗注釋:在讀寫渠道不同的情況下被調(diào)用生成寫的渠道2 程序描述TradeSendDataSINT32 TradeSendData(p_trade : Trade*, p_databus : DataBus*) 功能:調(diào)用商家方法發(fā)送數(shù)據(jù)總線中的數(shù)據(jù)輸人項(xiàng):Trade* p_tradeDataBus* p_databus輸出項(xiàng):S_OK成功其他失敗注釋:5.5 ClientInfo客戶端連接數(shù)據(jù)5.5.1 類圖5.5.2 類描述類描述存放客戶端連接數(shù)據(jù)和服
42、務(wù)渠道數(shù)據(jù) 成員描述begin_time開始放入的時(shí)間timeout_time預(yù)計(jì)超時(shí)時(shí)間(接口處理中有超時(shí)時(shí)間指定,不過目前基本都沒指定)trade_code商家代碼interface_id接口編號(hào)pkggrp_id報(bào)文組號(hào)pkg_idx報(bào)文序號(hào)5.6 ClientInfoTable客戶端連接數(shù)據(jù)表5.6.1 類圖5.6.2 類描述功能:n 存取客戶端ClientInfoTable連接數(shù)據(jù)n 生成存取鍵值n 定時(shí)清除超時(shí)的記錄 程序描述getInstance()ClientInfoTable* getInstance()功能:取得ClientInfoTable的單鍵輸人項(xiàng):輸出
43、項(xiàng):ClientInfoTable*注釋:用double-check加鎖 程序描述addRecordSINT32 addRecord( string key , ClientInfo* p_record )功能:添加一條記錄到表中如果已經(jīng)有了重復(fù)的,刪除以前的記錄,釋放記錄中的渠道輸人項(xiàng):stringkey鍵值ClientInfo* p_record p_record記錄輸出項(xiàng):0成功已有項(xiàng)相同主鍵,但被釋放-1失敗注釋:加鎖 程序描述fetchRecordClientInfo* fetchRecord(key : string) : 功能:取得ClientInfo
44、Table中 key 對(duì)應(yīng)的記錄并從表中去掉和這條記錄的聯(lián)系,防止被清除輸人項(xiàng):string key 鍵值輸出項(xiàng):ClientInfo*!=NULL已經(jīng)找到=NULL沒有找到注釋:如果沒有取到,可能已經(jīng)被清理掉了加鎖 程序描述clearTimeoutRecordsvoid clearTimeoutRecords() 功能:查找并清除表中超時(shí)的記錄遍歷表里的連接記錄,如果超時(shí)加入待釋放的列表最后遍歷釋放的列表查看每條待釋放的記錄查看記錄中的Channel如果channel!=NULL釋放channel刪除這條記錄輸人項(xiàng): 輸出項(xiàng):注釋:如果沒有取到,可能已經(jīng)被清理掉了加鎖要測(cè)試刪除
45、的使用性能:主要是鎖定的問題。遍歷的時(shí)候必須加鎖而釋放渠道就不用加鎖在遍歷的情況下加鎖,如果需要清除,加入列表中最后在解鎖的情況下對(duì)列表中元素進(jìn)行釋放Lock整張表UnLock表循環(huán)取下一條記錄直到表中記錄遍歷完為止是否超時(shí)記錄到釋放列表清除釋放列表中的記錄, 釋放占用的渠道待釋放列表測(cè)試底層使用了ACE_Hash_Map_Manager_Ex在42 上對(duì)1024條記錄進(jìn)行測(cè)試結(jié)果如下插入1024條 < 6毫秒( 0.006秒)遍歷1024條 <0.5毫秒( 0.0005秒)取出1024條 < 6毫秒( 0.006秒)取出1024條加入刪除鏈表 &l
46、t; 8毫秒( 0.008秒)單次插入 大約微秒(0.005毫秒)單次取出 大約微秒(0.005毫秒) 程序描述delete_a_client_infovoid delete_a_client_info( ClientInfo* tmp_info )功能:刪除一條記錄,釋放占用的渠道輸人項(xiàng):ClientInfo* tmp_info輸出項(xiàng):注釋:是一個(gè)內(nèi)部的函數(shù),是用來刪除記錄和渠道的工具不加鎖 程序描述cleanupvoid cleanup () 功能:清空全部記錄,釋放占用的渠道輸人項(xiàng):輸出項(xiàng):注釋:加鎖 程序描述generateKeystring
47、generateKey(DataBus* p_databus ) 功能:從p_databus取相應(yīng)字段生成鍵值輸人項(xiàng):DataBus* p_databus數(shù)據(jù)總線輸出項(xiàng):string key生成的鍵值注釋:5.7 ClientInfoTableMonitor客戶端連接數(shù)據(jù)表監(jiān)控程序5.7.1 類圖5.7.2 類說明功能:存取客戶端ClientInfoTable連接數(shù)據(jù)生成存取鍵值定時(shí)清除超時(shí)的記錄成員:ACE_Thread_t thread_idClientInfoTable* p_tableint interval_seconds 程序描述ClientInfoTableMoni
48、torClientInfoTableMonitor(ClientInfoTable* p_table , int interval_seconds ) 功能:構(gòu)造函數(shù),鎖定目標(biāo)Monitor,和時(shí)間間隔輸人項(xiàng):ClientInfoTable* p_table 目標(biāo)表int interval間隔秒數(shù)輸出項(xiàng):注釋: 程序描述startupint startup()功能:啟動(dòng)監(jiān)視線程輸人項(xiàng):輸出項(xiàng):0啟動(dòng)成功-1啟動(dòng)不成功注釋: 程序描述notify_cleanupvoid notify_cleanup()功能:通知ClientInfoTable做一次超時(shí)記錄的清理輸人項(xiàng):輸出項(xiàng):注釋: 程序描述shutdownvoid shutdown()功能:關(guān)閉監(jiān)視線程等待線程關(guān)閉后返回(join)輸人項(xiàng):輸出項(xiàng):注釋:5.8 FrontMain主控程序5.8.1 類間關(guān)系建立服務(wù)商家接入渠道工廠建立接收應(yīng)答商家接入渠道工廠建立服務(wù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度汽車租賃企業(yè)信用評(píng)價(jià)與監(jiān)管合作協(xié)議3篇
- 二零二五年度殘疾人冰雪項(xiàng)目數(shù)據(jù)統(tǒng)計(jì)分析合同2篇
- 臨時(shí)勞務(wù)派遣協(xié)議:2024年崗位派遣細(xì)則
- 二零二五年度高端寵物美容服務(wù)合同范本3篇
- 二零二四年度養(yǎng)殖場(chǎng)養(yǎng)殖技術(shù)培訓(xùn)與承包管理協(xié)議3篇
- 二零二四年文化企業(yè)明星代言合作協(xié)議3篇
- 二零二五年度牛羊養(yǎng)殖產(chǎn)業(yè)投資基金合作協(xié)議
- 二零二五年度農(nóng)業(yè)科技園區(qū)場(chǎng)地使用合同3篇
- 二零二五年度挖機(jī)運(yùn)輸安全責(zé)任認(rèn)定及處理協(xié)議3篇
- 2025至2030年中國(guó)伺服刀架數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024年河北省高考?xì)v史試卷(含答案解析)
- 車位款抵扣工程款合同
- 2023年湖北省襄陽市中考數(shù)學(xué)真題(原卷版)
- 小學(xué)六年級(jí)數(shù)學(xué)奧數(shù)題100題附答案(完整版)
- 湖南高速鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(含答案)
- 英漢互譯單詞練習(xí)打印紙
- 2023湖北武漢華中科技大學(xué)招聘實(shí)驗(yàn)技術(shù)人員24人筆試參考題庫(共500題)答案詳解版
- 一氯二氟甲烷安全技術(shù)說明書MSDS
- 母嬰護(hù)理員題庫
- SWITCH暗黑破壞神3超級(jí)金手指修改 版本號(hào):2.7.6.90885
- 2023高考語文全國(guó)甲卷詩歌閱讀題晁補(bǔ)之《臨江仙 身外閑愁空滿眼》講評(píng)課件
評(píng)論
0/150
提交評(píng)論