论文部分内容阅读
摘 要: 设计了商业银行行内的ECDS直连系统及其通讯层的接口,并通过消息队列的异步访问模式探讨了ECDS直连系统与前置机之间的报文交换原理。结果表明:该通讯方式能够保证系统稳定、可靠运行以及能较好的提高系统的效率。
关键词: ECDS直连系统; 消息队列; 异步访问
中图分类号: TP 393 文献标志码: A 文章编号: 1671-2153(2015)04-0065-04
1 ECDS直连系统
电子商业汇票(ECDS)系统的建成并运行,对我国的金融市场意义重大。作为金融业为系统参与者提供了多种接入方式以满足不同规模的商业银行、财务公司实现不同的业务需要。ECDS直连系统就是商业银行以直连接入的方式与中国人民银行ECDS系统对接,从而实现业务需求。
前置机系统[1]是商业银行业务进出ECDS系统的唯一途径,但是它只提供与中国人民银行ECDS系统之间的业务通讯,而银行行内系统与ECDS系统的对接问题要求自行解决。本文所指的商业银行ECDS直连系统就是处于前置机和商业银行之间的业务转换和通讯系统,同时也是前置机系统和商业银行行内系统之间的信息交互桥梁,它主要负责完成商业银行的行内系统与前置机之间的数据交互。
2 ECDS直连系统通讯层接口设计
对于ECDS直连系统在商业银行与前置机之间的报文交换,其通讯层的整体架构设计如图1所示。
中国人民银行ECDS系统与商业银行行内系统交互数据的中间载体为队列。对于行内系统发往前置机系统的往包,行内系统按要求自动生成报文号,并以规定的顺序与格式把往包数据通过商业银行电子汇票系统平台端API函数写入消息队列。在经直连系统转换处理时,该系统再以规定的格式与顺序把往包报文从该队列中读出并设计组包发送。对于从前置机发往行内系统的来包,直连转换系统以约定的格式和顺序将来包内容写入队列,然后再由商业银行的行内程序以规定的格式和顺序将其从队列中(通过API)读出并处理。
对于AS/400的行内主机,队列用DTAQ实现,对于AIX/SCO/HP等其他UNIX平台的行内主机,队列采用文件模拟实现队列的功能。
AS/400的行内主机系统通过DTAQ与直连转换系统进行数据交互,直连转换系统不提供队列操作的API函数。对于AIX/SCO/HP等其他UNIX平台的行内主机系统,则向行内提供直连转换系统API以实现与队列的数据交互。
直连系统通过商业银行电子汇票系统平台端的API接口与ECDS单一前置机系统之间进行数据报的转发。而在商业银行电子汇票直连系统内部,通过SOCKET设置其应用程序端口,来实现行内系统与中国人民银行ECDS系统平台之间的数据传输。若商业银行自身有MQ等消息中间件,则图1中的通讯模块可替换为消息中间件的方式实现行内系统与中国人民银行ECDS系统平台之间的数据传输。
3 消息队列
3.1 分布式消息队列的概念
在跨进程通信时,通常需要一个独立的载体实现它们之间的消息传递。以队列的方式来传递消息既具有数据的独立性又存在进程间的连贯性。无论是在单机环境还是网络环境,它都作为消息的载体,由一个个消息串连接而成。在局域网或是广域网内,它能够被所有经过授权的网络节点所共享,如图2所示。因此,把这一类消息队列称为分布式消息队列[2]。由于消息队列的特殊数据结构,使得分布在网络环境中的各类节点在进行消息传送时,都具有自己对数据的独立管理和访问功能;对于在C/S网络环境下的数据访问,分布式消息队列模式仍然适用。
由于消息队列的数据传送要依靠其程序的API接口函数,所以在很多情况下,对网络环境和单机环境API接口的兼容性要求很高。在网络环境下,由于资源共享的优势,服务器和客户端需要频繁传送消息。该分布式消息队列根据自身独立存在的特点,能够实现对数据独立管理的功能,所以在它的支持下,通讯双方不必担心数据在通信层的传送是否发生错误,只要专注于自己的业务数据即可。
3.2 分布式消息队列中的API接口功能
行内系统与中国人民银行前置机系统之间的数据交换,要通过消息队列作为中间载体。在分布式消息队列中,提供了大量API接口函数,以此来访问或操作队列上的数据。
下面在分布式网络环境下,对这些API接口功能[3-4]和属性特征进行详细描述。
3.2.1 队列的打开或创建
Mqd_t mq_open(const char*pathname,int oflag,const struct sigevent*notification.../*mode_t mode,struct mq_attr attr/);
对于任何进程访问分布式消息队列的第一步就是使用此函数建立或打开一个消息队列,该消息队列被打开后,除用于消息的发送与接收外,更重要的是方便日后队列的管理。
在上述参数中pathname表示分布式环境下消息队列的网络路径,oflag用于表示以读或写或读写的方式打开分布式消息队列;当实际要求创建一个新队列时(如已经指定O_CREATE标志),mode在用于队列管理中起到了用户身份鉴别的作用,Attr用于说明新建队列的各类属性特点。
3.2.2 发送报文消息
Int _send_(mqd_t mqdes, unsigned int prio struct mq_attr*attr,const struct sigevent*notification);
当消息队列被创建或被打开后,其结果会返回一个描述字mqdes;创建队列的发送方通过send函数对该描述字所代表的目标程序发送数据。当然发送方在发送数据的同时还可以通过参数attr指针来指定以下选项:消息的类型、事务还是非事务、传递的方式以及是否加密传输、是否保存日志等;同时,参数notification用于表示系统发送消息时的方式(同步发送或异步发送)。 3.2.3 接收报文消息
Int_receive_from_idsys(char*buf,int sync_flag);
对于消息队列发送成功的数据,其目标程序所在的接收方,通过最初创建队列时产生的描述字mqdes,接收报文消息,接收时需使用receive函数对其进行检索筛选。其中参数buf表示接收到的报文放入buf中;sync_flag表示接收方检索的方式,0表示异步接收,1表示同步接收;参数nonblock表示函数调用的方式。
4 异步报文处理模式
商业银行的直连系统与中国人民银行 ECDS 系统的报文交互,其处理流程为:直连系统将待发的报文进行组装,并发送至消息队列,经中国人民银行前置机系统查询后,对其报文做相应的转换处理,发往中国人民银行;同时中国人民银行再通过前置机系统将ECDS系统处理的结果发送到消息队列,最后商业银行的直连系统得到消息队列的响应报文并进行处理。在处理报文的过程中,分为实时报文处理和异步报文处理。
异步处理模式[5]:行内发送服务可多份(可以和网点交易服务捆在一起),但行内接受服务必须一个,且能将不同的同步响应准确返回到对应的网点交易服务。异步模式下,发送程序成功调用SEND_TO_IDSYS后,不用等待接收返回的9012报文,可以直接发送下一笔报文,这种模式支持多进程同时发送,如图3所示。
在该模式下,一个完整的发送流程为:
(1) 组包;
(2) SEND_TO_IDSYS。
其源代码为:
int SetHeadMsgNo(const char * msg_no);//必选,报文序号
int SetHeadMsgIP(const char * msg_ip);//必选,报文ip地址
int SetHeadMsgId(const char * msg_id);//必选,报文标示号
int SetHeadRefId(const char *ref_id);//必选,
报文参考号
int SetHeadWkdt(const char *wkdt); //必选,
工作日期,yyyymmdd
int SetHeadSndCode(const char *snd_code); //必选 发起节点代码
int SetHeadRcvCode(const char *rcv_code); //必选 接收节点代码
int SetHeadAppName(const char*app_name); //必选 应用名称
int SetMsgVer(const char *msg_ver);//设置报文版本号
void SetMsgSndTim(void); //设置发送时间
void SetHeadInOut(const char * in_out);//必选,来帐往帐标识
功能:设置报文头中字段的相关信息到buf中;
int SetPkgValue(const char *tag_name, const char *value);
功能:设置报文体信息;
void GetPkg(char *out_buf);
功能:获得要发送的报文,获得的报文存放在buf中;
int SEND_TO_IDSYS (char *send_buf);
功能:把组好的报文写入队列中。
异步模式下,接收程序调用RECV_FROM_IDS?鄄
YS时,必须设sync_flag = 0(或不设置,缺省值为0),同时接收程序将扫描接收队列和回应队列,即会接收到来帐指令或往账的回应指令。对于不同的指令,接收程序必须分别处理。如对来账指令,处理模式不变;对回应指令,则必须通过报文参考号(9012)或回应报文中的其他信息查找到原对应的往账指令并相应处理。一个完整的接收流程为:
(1) RECV_FROM_IDSYS,sync_flag=0(缺省值);
(2) 解包并处理(包括mbfe返回的9012、来账指令、其他异步回应);
(3) COMMIT_CURRENT_MSG。
5 结束语
本文所指的ECDS直连系统是商业银行行内开发的独立系统,起到行内系统与中国人民银行ECDS系统之间数据交互的桥梁作用,它在通讯层与前置机之间的数据传输,本文主要以基于消息队列的Socket通讯方式为主。其实,在很多金融信息平台中,MQ中间件的应用也是很广泛的,但是MQ中间件更适用于实时通讯环境,而本文对于报文的收发处理,主要以异步处理模式为主,所以Socket通讯方式更为合适。
参考文献:
[1] 于会军. 基于商场收银POS一体化前置机系统的研究与实现[D]. 中南大学,2007.
[2] 卢本捷. 分布式消息队列的理论、实现与应用[D]. 华中科技大学,2003.
[3] 丁静. 基于Socket和消息队列的中后台接口通讯软件的设计[J]. 大连民族学院学报,2006(3):65-68.
[4] 李光师. 如何在VB中利用Windows API调用其他应用程序[J]. 鞍山师范学院学报,2004(2):69-71.
[5] 何红波,陆建德,丁卫平. 基于中间件MQSeries的消息队列异步通信服务的应用研究[J]. 南通大学学报:自然科学版,2006(12):86-89.
(责任编辑:徐兴华)
关键词: ECDS直连系统; 消息队列; 异步访问
中图分类号: TP 393 文献标志码: A 文章编号: 1671-2153(2015)04-0065-04
1 ECDS直连系统
电子商业汇票(ECDS)系统的建成并运行,对我国的金融市场意义重大。作为金融业为系统参与者提供了多种接入方式以满足不同规模的商业银行、财务公司实现不同的业务需要。ECDS直连系统就是商业银行以直连接入的方式与中国人民银行ECDS系统对接,从而实现业务需求。
前置机系统[1]是商业银行业务进出ECDS系统的唯一途径,但是它只提供与中国人民银行ECDS系统之间的业务通讯,而银行行内系统与ECDS系统的对接问题要求自行解决。本文所指的商业银行ECDS直连系统就是处于前置机和商业银行之间的业务转换和通讯系统,同时也是前置机系统和商业银行行内系统之间的信息交互桥梁,它主要负责完成商业银行的行内系统与前置机之间的数据交互。
2 ECDS直连系统通讯层接口设计
对于ECDS直连系统在商业银行与前置机之间的报文交换,其通讯层的整体架构设计如图1所示。
中国人民银行ECDS系统与商业银行行内系统交互数据的中间载体为队列。对于行内系统发往前置机系统的往包,行内系统按要求自动生成报文号,并以规定的顺序与格式把往包数据通过商业银行电子汇票系统平台端API函数写入消息队列。在经直连系统转换处理时,该系统再以规定的格式与顺序把往包报文从该队列中读出并设计组包发送。对于从前置机发往行内系统的来包,直连转换系统以约定的格式和顺序将来包内容写入队列,然后再由商业银行的行内程序以规定的格式和顺序将其从队列中(通过API)读出并处理。
对于AS/400的行内主机,队列用DTAQ实现,对于AIX/SCO/HP等其他UNIX平台的行内主机,队列采用文件模拟实现队列的功能。
AS/400的行内主机系统通过DTAQ与直连转换系统进行数据交互,直连转换系统不提供队列操作的API函数。对于AIX/SCO/HP等其他UNIX平台的行内主机系统,则向行内提供直连转换系统API以实现与队列的数据交互。
直连系统通过商业银行电子汇票系统平台端的API接口与ECDS单一前置机系统之间进行数据报的转发。而在商业银行电子汇票直连系统内部,通过SOCKET设置其应用程序端口,来实现行内系统与中国人民银行ECDS系统平台之间的数据传输。若商业银行自身有MQ等消息中间件,则图1中的通讯模块可替换为消息中间件的方式实现行内系统与中国人民银行ECDS系统平台之间的数据传输。
3 消息队列
3.1 分布式消息队列的概念
在跨进程通信时,通常需要一个独立的载体实现它们之间的消息传递。以队列的方式来传递消息既具有数据的独立性又存在进程间的连贯性。无论是在单机环境还是网络环境,它都作为消息的载体,由一个个消息串连接而成。在局域网或是广域网内,它能够被所有经过授权的网络节点所共享,如图2所示。因此,把这一类消息队列称为分布式消息队列[2]。由于消息队列的特殊数据结构,使得分布在网络环境中的各类节点在进行消息传送时,都具有自己对数据的独立管理和访问功能;对于在C/S网络环境下的数据访问,分布式消息队列模式仍然适用。
由于消息队列的数据传送要依靠其程序的API接口函数,所以在很多情况下,对网络环境和单机环境API接口的兼容性要求很高。在网络环境下,由于资源共享的优势,服务器和客户端需要频繁传送消息。该分布式消息队列根据自身独立存在的特点,能够实现对数据独立管理的功能,所以在它的支持下,通讯双方不必担心数据在通信层的传送是否发生错误,只要专注于自己的业务数据即可。
3.2 分布式消息队列中的API接口功能
行内系统与中国人民银行前置机系统之间的数据交换,要通过消息队列作为中间载体。在分布式消息队列中,提供了大量API接口函数,以此来访问或操作队列上的数据。
下面在分布式网络环境下,对这些API接口功能[3-4]和属性特征进行详细描述。
3.2.1 队列的打开或创建
Mqd_t mq_open(const char*pathname,int oflag,const struct sigevent*notification.../*mode_t mode,struct mq_attr attr/);
对于任何进程访问分布式消息队列的第一步就是使用此函数建立或打开一个消息队列,该消息队列被打开后,除用于消息的发送与接收外,更重要的是方便日后队列的管理。
在上述参数中pathname表示分布式环境下消息队列的网络路径,oflag用于表示以读或写或读写的方式打开分布式消息队列;当实际要求创建一个新队列时(如已经指定O_CREATE标志),mode在用于队列管理中起到了用户身份鉴别的作用,Attr用于说明新建队列的各类属性特点。
3.2.2 发送报文消息
Int _send_(mqd_t mqdes, unsigned int prio struct mq_attr*attr,const struct sigevent*notification);
当消息队列被创建或被打开后,其结果会返回一个描述字mqdes;创建队列的发送方通过send函数对该描述字所代表的目标程序发送数据。当然发送方在发送数据的同时还可以通过参数attr指针来指定以下选项:消息的类型、事务还是非事务、传递的方式以及是否加密传输、是否保存日志等;同时,参数notification用于表示系统发送消息时的方式(同步发送或异步发送)。 3.2.3 接收报文消息
Int_receive_from_idsys(char*buf,int sync_flag);
对于消息队列发送成功的数据,其目标程序所在的接收方,通过最初创建队列时产生的描述字mqdes,接收报文消息,接收时需使用receive函数对其进行检索筛选。其中参数buf表示接收到的报文放入buf中;sync_flag表示接收方检索的方式,0表示异步接收,1表示同步接收;参数nonblock表示函数调用的方式。
4 异步报文处理模式
商业银行的直连系统与中国人民银行 ECDS 系统的报文交互,其处理流程为:直连系统将待发的报文进行组装,并发送至消息队列,经中国人民银行前置机系统查询后,对其报文做相应的转换处理,发往中国人民银行;同时中国人民银行再通过前置机系统将ECDS系统处理的结果发送到消息队列,最后商业银行的直连系统得到消息队列的响应报文并进行处理。在处理报文的过程中,分为实时报文处理和异步报文处理。
异步处理模式[5]:行内发送服务可多份(可以和网点交易服务捆在一起),但行内接受服务必须一个,且能将不同的同步响应准确返回到对应的网点交易服务。异步模式下,发送程序成功调用SEND_TO_IDSYS后,不用等待接收返回的9012报文,可以直接发送下一笔报文,这种模式支持多进程同时发送,如图3所示。
在该模式下,一个完整的发送流程为:
(1) 组包;
(2) SEND_TO_IDSYS。
其源代码为:
int SetHeadMsgNo(const char * msg_no);//必选,报文序号
int SetHeadMsgIP(const char * msg_ip);//必选,报文ip地址
int SetHeadMsgId(const char * msg_id);//必选,报文标示号
int SetHeadRefId(const char *ref_id);//必选,
报文参考号
int SetHeadWkdt(const char *wkdt); //必选,
工作日期,yyyymmdd
int SetHeadSndCode(const char *snd_code); //必选 发起节点代码
int SetHeadRcvCode(const char *rcv_code); //必选 接收节点代码
int SetHeadAppName(const char*app_name); //必选 应用名称
int SetMsgVer(const char *msg_ver);//设置报文版本号
void SetMsgSndTim(void); //设置发送时间
void SetHeadInOut(const char * in_out);//必选,来帐往帐标识
功能:设置报文头中字段的相关信息到buf中;
int SetPkgValue(const char *tag_name, const char *value);
功能:设置报文体信息;
void GetPkg(char *out_buf);
功能:获得要发送的报文,获得的报文存放在buf中;
int SEND_TO_IDSYS (char *send_buf);
功能:把组好的报文写入队列中。
异步模式下,接收程序调用RECV_FROM_IDS?鄄
YS时,必须设sync_flag = 0(或不设置,缺省值为0),同时接收程序将扫描接收队列和回应队列,即会接收到来帐指令或往账的回应指令。对于不同的指令,接收程序必须分别处理。如对来账指令,处理模式不变;对回应指令,则必须通过报文参考号(9012)或回应报文中的其他信息查找到原对应的往账指令并相应处理。一个完整的接收流程为:
(1) RECV_FROM_IDSYS,sync_flag=0(缺省值);
(2) 解包并处理(包括mbfe返回的9012、来账指令、其他异步回应);
(3) COMMIT_CURRENT_MSG。
5 结束语
本文所指的ECDS直连系统是商业银行行内开发的独立系统,起到行内系统与中国人民银行ECDS系统之间数据交互的桥梁作用,它在通讯层与前置机之间的数据传输,本文主要以基于消息队列的Socket通讯方式为主。其实,在很多金融信息平台中,MQ中间件的应用也是很广泛的,但是MQ中间件更适用于实时通讯环境,而本文对于报文的收发处理,主要以异步处理模式为主,所以Socket通讯方式更为合适。
参考文献:
[1] 于会军. 基于商场收银POS一体化前置机系统的研究与实现[D]. 中南大学,2007.
[2] 卢本捷. 分布式消息队列的理论、实现与应用[D]. 华中科技大学,2003.
[3] 丁静. 基于Socket和消息队列的中后台接口通讯软件的设计[J]. 大连民族学院学报,2006(3):65-68.
[4] 李光师. 如何在VB中利用Windows API调用其他应用程序[J]. 鞍山师范学院学报,2004(2):69-71.
[5] 何红波,陆建德,丁卫平. 基于中间件MQSeries的消息队列异步通信服务的应用研究[J]. 南通大学学报:自然科学版,2006(12):86-89.
(责任编辑:徐兴华)