接口详细设计文档.docx
- 文档编号:24165839
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:37
- 大小:522.89KB
接口详细设计文档.docx
《接口详细设计文档.docx》由会员分享,可在线阅读,更多相关《接口详细设计文档.docx(37页珍藏版)》请在冰豆网上搜索。
接口详细设计文档
接口详细设计文档
作者:
唐为(为哥)
审核:
赵锟
日期:
2005-5-27
1编写目的
预期读者:
对接口行为和目的有一定了解的人
背景说明
⏹软件系统名称:
接口前端接入服务器
⏹描述<接口>接收不同商家的接入,接收数据转发给主机服务器,并同步/异步将返回数据发给接入商家的行为
2名词解释
⏹ChannelBase渠道,通信基类,提供数据收发和释放的方法接口用子类实现来封装了不同通信方式目前有TCP短连接接入,从ACEMessage_Queue中读取(IPCMessageQueue->ACE_Message_Queue)
⏹Trade*trade商家对象,代表的其实是针对该商家处理方法的集合将接入数据的商家称为服务商家而将请求面向的商家称为主机商家,主机商家负责同步/异步返回交易的应答数据给接口平台
⏹而接口(数据交换)平台是在两者之间的交换平台
⏹渠道工厂:
把接入数据的渠道工厂统一定为服务渠道工厂,发送数据的渠道工厂统一定为主机通道工厂
3
组件分布图
4程序结构
4.1接入处理线程类图
PatternNewSyncAsyncInnerDir
是ProcessPattern的一个子类,实现发送主机服务器并判断同/异步返回
同步直接返回给接入商家
异步只做相应记录
ProcessPattern
是后续处理的全部流程
抽象类
子类实现对应不同流程
ThreadInSvcProcessor是接入处理线程的主流程
收数,接包无误后将处理控制权交给ProcessPattern
4.2接收线程类图
4.3启动控制图
5程序设计说明
5.1对原系统的改动
⏹改变原有商家Trade类,不存放渠道对象在商家类中,商家类只执行商家处理,不负责渠道的管理
⏹改动原有的系统中所有模式的处理,模式处理必须对渠道的释放负责
⏹修改MidHstChannel,添加后台服务需要的2个FML字段,这两个字段是:
FML域名
描述
S_INTERF_NO
接口标识号,整数。
系统中接收异步响应程序的唯一编号。
用于标识请求的来源,异步应答根据这个号码分发给具体的接口程序。
S_TX_CTRL_ATTR
交易控制属性,字符串。
接口都填0,表示这是正常的交易请求。
5.2ThreadInSvcProcessor接入处理器
5.2.1类图
5.2.2时序图
预先说明:
⏹ChannelBase渠道通信基类,提供数据收发和释放的方法接口用子类实现来封装了不同通信方式。
目前有TCP短连接接入。
从ACEMessage_Queue中读取(IPCMessageQueue->ACE_Message_Queue)
⏹Trade*trade商家:
代表的其实是针对该商家处理方法的集合
5.2.3流程图
5.2.4ThreadInSvcProcessor类说明
5.2.4.1功能
收取用不同渠道接入的外部商家的请求识别,解包执行处理的模式具体的流程在模式中控制,并不做控制
模式可能有3种:
1.无返回:
发送后台,不接收应答对应模式PatternASyncInnerDir,需要修改原来的相关程序,在本文档中并不涉及
2.有返回,根据返回的应答判断是同步返回还是异步返回如果接收的应答表明是同步返回,按正常模式返回如果接收的应答表明是异步返回,按异步模式处理对应模式PatternNewSyncASyncInnerDirThreadInSvcProcessor后续的ProcessPattern应该是PatternNewSyncASyncInnerDir.ThreadInSvcProcessor只负责接入后调用模式,并处理异常情况
3.安全异常情况的模式下,调用模式PatternErrorSyncInner来处理,必须限制:
主要的改动是渠道的释放由模式来管理涉及模式有PatternASyncInnerDir,PatternNewSyncASyncInnerDir,PatternErrorSyncInner(可能不全面)
5.2.4.2程序描述ThreadInSvcProcessor
ThreadInSvcProcessor(Trade*ptrade,SvcChannelFactory*pfactory,bool*_bexit)
功能:
构造函数
性能:
输人项:
Trade*trade接入数据处理的商家类
SvcChannelFactory*pfactory接入数据渠道工厂
bool*exit退出标志
输出项:
注释:
5.2.4.3程序描述SvcRun
voidSvcRun()
功能:
主控流程
输人项:
无
输出项:
无
流程
:
服务商家在开始已经生成,生存周期里一直存在一个DataBus对象(数据总线),每线程一个DataBus对象。
在生存周期里一直存在
DataBus对象初始化
循环处理
{
SINT32ret=a_process_loop(Trade*ptrade,SvcChannelFactory*pfactory,DataBus*pDataBus);
if(bool*exit==true)
{
释放渠道
跳出循环
}
为下一次使用清空DataBus对象
}
收尾处理,释放recv_trade
5.2.4.4程序描述a_process_loop
SINT32a_process_loop(Trade*ptrade,SvcChannelFactory*pfactory,DataBus*pDataBus)
功能:
一次交易的处理
输人项:
Trade*pTrade,接收数据的服务商家服务渠道
SvcChannelFactory*pFactory,服务商家接收数据的主机通道
SvcChannelFactory*pFactory服务商家渠道的生成工厂。
DataBus*pDataBus预先创建的数据总线,不需要每次重建
输出项:
S_OK成功完成
其他出错信息
流程:
依次执行
GetChannel生成接入渠道ChannelBase*(根据商家生成一个ChannelBase的子类)
除非出错,整个流程不释放该ChannelBase,委托给Patten负责释放
TradeRecvData服务商家接收数据
TradeInProcess服务商家进入处理(最主要一项功能就是接口识别)
If(TradeInProcess成功&&安全函数出错)//安全函数一般是mac校验失败
{
根据p_databus->pack_type对请求和应答作2种不同的处理
if(pack_type是请求)
{
执行RequestSecureFailedProcess函数调用
}else//应答报文
{
结果是应答直接丢弃,返回成功
不管结果如何都跳到异常处理,但是返回值可能因SecureFailedProcess的执行结果而不同
}
}else
{
否则生成Patern对象
生成对方商家hst_trade
生成模式对象Pattern,将服务商家和对方商家传入
执行ExecPattern执行具体的模式处理,将渠道委托给Patten负责释放
}
异常处理:
记录出错信息和时间
当异常发生在ExecPattern之外,释放渠道
结束处理:
(无论异常与否都执行):
释放对方商家hst_trade
释放模式对象Pattern
注释:
为了便于单元测试,从SvcRun中分离出该方法
也可以在SvcRun中实现上述的全部逻辑
5.2.4.5程序描述GetChannel
SINT32GetChannel(SvcChannelFactory*factory,ChannelBase**ACE_Time_Value*time_val)
功能:
调用svc_factory生成服务渠道
性能:
输人项:
SvcChannelFactory*svc_factory渠道工厂
ACE_Time_Value*time_val超时时间这个超时目前是一个固定值,和接收数据和发送数据的超时无直接联系
ChannelBase*!
=NULL未取得=NULL取得
输出项:
返回值
注释:
出错信息在该方法中输出流程中只判断是否取得,没有取得则应该跳到开头进入下一次循环
测试:
对所有的可能生成的ChannelBase都进行一次测试
5.2.4.6程序描述TradeRecvData
SINT32TradeRecvData(Trade*p_recv_trade,ChannelBase*p_chnbase,DataBus*p_databus,ACE_Time_Value*time_out)
功能:
商家通过渠道接收数据放入p_databus中
输人项:
ChannelBase*p_chnbase收取的渠道
Trade*p_recv_trade接收的商家
DataBus*p_databus存放数据的DataBus
ACE_Time_Value*time_out超时时间
输出项:
0成功
-1读取失败或者超时
注释:
主流程不记录详细出错信息
5.2.4.7程序描述TradeInProcess
SINT32TradeInProcess(Trade*p_trade,DataBus*p_databus)
功能:
执行商家的入口处理(识别,解包。
。
。
)
p_databus的_data_buff和_len字段分别表示数据指针和长度
输入处理后将数据填入p_databus的_var_pool和_var_reco_pool(识别数据)中
输人项:
Trade*p_trade接收服务商家
DataBus*p_databus存放数据的DataBus
输出项:
0成功
-1读取失败或者超时
注释:
没有超时限制,要控制短时间内完成
5.2.4.8程序描述RequestSecureFailedProcess
SINT32RequestSecureFailedProcess(DataBus*p_databus,Trade*p_trade,ChannelBase*in_svc_channel)
功能:
对输入是请求报文的安全类函数失败后的处理(输入是应答报文的就直接丢弃)
输人项:
DataBus*p_databus数据
Trade*p_trade输入服务商家
ChannelBase*in_svc_channel输入服务的渠道
输出项:
S_OK应答保报文,不加理会
INTIDENERROR(SECUFAILED)请求报文,执行安全异常处理模式成功
其他。
请求报文,执行安全异常处理模式中出错
注释:
无论SecureFailedProcess的执行结果如何都不继续执行后面的操作
5.2.4.9程序描述ExecPattern
SINT32ExecPattern(ProcessPattern*pattern,DataBus*p_databus,ChannelBase*p_channel)
功能:
执行处理模式,全部处理交给pattern
输人项:
ProcessPattern*pattern处理模式
DataBus*p_databus存放数据的数据总线
ChannelBase*channel输入服务渠道,交给Pattern管理释放
输出项:
S_OK成功
其他失败
注释:
ChannelBase*输入渠道,如果Pattern没有生成等错误,还是主控来释放p_channel
执行pattern->Process后就不管了可能设置一个标志位来表示是否执行了Pattern,执行过最后就不用释放channel了
(是否可以这样?
SINT32ExecPattern(ProcessPattern*pattern,DataBus*p_databus,ChannelBase**p_channel)
主程序都删除p_channel,但是ExecPattern有可能返回的p_channel是NULL。
此时的主控是什么都不做。
如果非null就删除)
5.3PatternNewSyncAsyncInnerDir同异步向内处理模式
5.3.1类图
5.3.2描述
预先了解:
交换平台接入的是服务商家,发送的是主机商家(主机)PatternNewSyncAsyncInnerDir继承ProcessPattern类
5.3.3流程图
见下页
通过后台返回的fml变量S_TX_STATUS来判断
5.3.4类说明
5.3.4.1构造函数PatternNewSyncAsyncInnerDir
PatternNewSyncAsyncInnerDir(Trade*svc_trade,Trade*host_trade);
svc_trade和host_trade分别代表服务商家和主机商家
5.3.4.2方法Process
SINT32Process(DataBus*p_databus,ChannelBase*p_channel,ACE_Time_Value*time_val);
DataBus*p_databus数据总线,包含了解包解开的数据(FML格式)
ChannelBase*p_inchannel服务商家接入的渠道
ACE_Time_Value*time_val超时时间
这样我们就拥有了处理需要的全部信息。
而其他缺少的是在执行中生成的信息了
5.3.4.3程序描述TradeOutProcess
SINT32TradeOutProcess(Trade*p_trade,DataBus*p_databus)
功能:
执行商家输出处理
将数据处理(打包,加密。
。
。
)处理到发送前的状态
输人项:
Trade*p_trade商家
DataBus*p_databus数据总线
输出项:
S_OK成功
其他失败
注释:
5.3.4.4程序描述CallHost
SINT32CallHost(Trade*p_hst_trade,DataBus*p_databus)
输人项:
Trade*p_hst_trade主机商家
DataBus*p_databus数据总线
输出项:
S_OK成功
其他失败
注释:
实际上是封装了一次发送接收的处理在这个模式里并不考虑单发无返回的情况,全部是发送后等待返回的情况
功能:
执行和主机商家的一次交互。
执行的流程如下:
创建主机商家发送的主机通道,
发送数据
if(读写不是同一条通道)
{
释放发送主机通道
设置发送主机通道为NULL
创建主机商家接收的主机通道接收数据
}
释放接收的主机商家通道,
在此过程中所有生成的通讯渠道都要负责清除
失败情况分析:
ChannelBase*send_channel=NULL;
ChannelBase*recv_channel=NULL
创建主机商家发送的主机通道失败
问题:
当tuxedo出错的时候的处理如何进行
回答:
在目前的情况下,主机服务渠道实际上是tpcall后台,
渠道实现中控制了该渠道的发送接收必然返回同步成功,如果通讯失败,由该主机生成返回码,复制请求数据到返回数据中
{返回码的生成是
设置交易状态为同步返回S_TX_STATUS=1,
设置响应码S_RSP_CD为“2023”
设置响应码描述信息S_RSP_DESC为“调用后台服务错误”
}
交易或者通讯(tpcall)的失败由返回标志位和返回码来确定
可能发生情况:
1.同步失败可细分为通讯失败和后台处理返回失败(问题中的情况)
2.同步成功同步执行完毕
3.异步已发送异步处理,已经成功发送S_TX_STATUS=0
5.3.4.5程序描述TradeInProcess
SINT32TradeInProcess(Trade*p_trade,DataBus*p_databus)
功能:
执行主机商家的输入处理
执行主机商家的对应操作,将p_databus中的原始数据识别出接口信息,转换成FML数据存放在p_databus的_var_pool和_var_reco_pool中
输人项:
Trade*p_hst_trade主机商家
DataBus*p_databus数据总线
输出项:
S_OK成功
其他失败
注释:
5.3.4.6程序描述is_sync_return
boolis_sync_return(DataBus*p_databus)
功能:
查看p_databus,判断这次返回是否是同步返回
输人项:
DataBus*p_databus数据总线
输出项:
true同步返回
false异步返回
注释:
5.3.4.7程序描述is_same_rw_svcchannel
boolis_same_rw_svcchannel(Trade*p_trade)
功能:
查看该商家是否在同一链路上返回请求
根据商家查看该商家的服务渠道定义
查询
如果没有定义了商家写的渠道,则表明读写渠道是一样的
如果定义了商家写的渠道,则表明读写渠道是不同的
输人项:
Trade*p_trade服务商家
输出项:
true是
false不是
注释:
通过查看商家的读写渠道是否相同,可以在处理前明白是否可以提前释放读的渠道
返回给商家的时候明白是否要生成新的写的渠道
5.3.4.8程序描述createClientInfo
ClientInfo*createClientInfo(DataBus*p_databus,ChannelBase*p_channel)
功能:
创建一项异步返回的客户端连接记录
无论p_channel是否=NULL,都填入新建的ClientInfo中
输人项:
DataBus*p_databus
ChannelBase*p_channel返回的渠道
只有读写原路返回的才!
=NULL
如果写要重新创建的填NULL
可以的话用ACE_ASSERT判断一下
输出项:
ClientInfo*客户连接记录
!
=NULL成功
=NULL不大可能
注释:
5.3.4.9程序描述addToClientInfoTable
voidaddToClientInfoTable(stringkey,ClientInfo*info)
功能:
创建一项异步返回的客户端连接记录
输人项:
stringkey键值目前是由ClientInfoTable的generateKey(p_databus:
DataBus*)生成
ClientInfo*info记录
输出项:
ClientInfo*客户连接记录
注释:
5.4ThreadReplySvcProcessor异步应答返回处理器
5.4.1类图
5.4.2类说明
5.4.2.1程序描述ThreadReplySvcProcessor
ThreadReplySvcProcessor(Trade*ptrade,SvcChannelFactory*pfactory,bool*_bexit)
功能:
构造函数
性能:
输人项:
Trade*trade接收返回数据处理的商家类服务商家,对于ATM接口就是ATM服务商家
SvcChannelFactory*pfactory接收返回数据渠道工厂
bool*exit退出标志
输出项:
注释:
这里的服务商家就是存放在ClientInfo记录中的商家代码(trade_code)对应的服务商家,要根据trade_code来动态生成和释放
5.4.2.2程序描述SvcRun
voidSvcRun()
主流程
功能:
接收主机商家异步交易返回的数据并向服务商家发送的
输人项:
无
输出项:
无
流程:
生成接收主机商家
DataBus初始化
循环处理
{
SINT32ret=a_process_loop(ptrade,SvcChannelFactory*pfactory,DataBus*pDataBus);
清空DataBus,以便下次重复使用
if(退出标志被设置并且渠道返回获得渠道收数为超时)
{
跳出循环
}
}
收尾处理,释放recv_trade
注释:
单次处理的方法在a_loop_process中实现
5.4.2.3程序描述a_process_loop
SINT32a_process_loop(Trade*ptrade,SvcChannelFactory*pfactory,DataBus*pDataBus)
功能:
一次交易的处理
输人项:
Trade*pTrade将应答数据返回对应的商家(对于ATM接口就是ATMC对应的那个)
SvcChannelFactory*pFactory主机商家接收数据的主机通道异步应答渠道的生成工厂
DataBus*pDataBus预先创建的数据总线,不需要每次重建
输出项:
S_OK成功完成
其他出错信息
流程
设置主机商家接收通道和服务商家返回渠道,返回的服务商家为NULL
ChannelBase*recvChannel=NULL;
ChannelBase*returnChannel=NULL;
Trade*svcChannel=NULL;
先执行GetRecvChannel
取得接收数据的渠道(ChannelBase*),取不到则直接跳到最后的出错处理
然后执行TradeRecvDataRecvReplyData收数据放入DataBus的_databuff,长度放入_len
收完数据可以释放recvChannel,recvChannel=NULL
然后执行UnpackRecvData解开数据
执行UnpackRecvData将数据解开为FMLBuffer
然后调用ClientInfoTable的generateKey方法生成键值
然后调用fetchClientInfoRecord取得记录ClientInfoRecord*
然后RecoverDataBusInfo调用恢复返回前的DataBus信息
然后根据ClientI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 接口 详细 设计 文档