王莉
摘 要: 設(shè)計(jì)了商業(yè)銀行行內(nèi)的ECDS直連系統(tǒng)及其通訊層的接口,并通過(guò)消息隊(duì)列的異步訪問(wèn)模式探討了ECDS直連系統(tǒng)與前置機(jī)之間的報(bào)文交換原理。結(jié)果表明:該通訊方式能夠保證系統(tǒng)穩(wěn)定、可靠運(yùn)行以及能較好的提高系統(tǒng)的效率。
關(guān)鍵詞: ECDS直連系統(tǒng); 消息隊(duì)列; 異步訪問(wèn)
中圖分類號(hào): TP 393 文獻(xiàn)標(biāo)志碼: A 文章編號(hào): 1671-2153(2015)04-0065-04
1 ECDS直連系統(tǒng)
電子商業(yè)匯票(ECDS)系統(tǒng)的建成并運(yùn)行,對(duì)我國(guó)的金融市場(chǎng)意義重大。作為金融業(yè)為系統(tǒng)參與者提供了多種接入方式以滿足不同規(guī)模的商業(yè)銀行、財(cái)務(wù)公司實(shí)現(xiàn)不同的業(yè)務(wù)需要。ECDS直連系統(tǒng)就是商業(yè)銀行以直連接入的方式與中國(guó)人民銀行ECDS系統(tǒng)對(duì)接,從而實(shí)現(xiàn)業(yè)務(wù)需求。
前置機(jī)系統(tǒng)[1]是商業(yè)銀行業(yè)務(wù)進(jìn)出ECDS系統(tǒng)的唯一途徑,但是它只提供與中國(guó)人民銀行ECDS系統(tǒng)之間的業(yè)務(wù)通訊,而銀行行內(nèi)系統(tǒng)與ECDS系統(tǒng)的對(duì)接問(wèn)題要求自行解決。本文所指的商業(yè)銀行ECDS直連系統(tǒng)就是處于前置機(jī)和商業(yè)銀行之間的業(yè)務(wù)轉(zhuǎn)換和通訊系統(tǒng),同時(shí)也是前置機(jī)系統(tǒng)和商業(yè)銀行行內(nèi)系統(tǒng)之間的信息交互橋梁,它主要負(fù)責(zé)完成商業(yè)銀行的行內(nèi)系統(tǒng)與前置機(jī)之間的數(shù)據(jù)交互。
2 ECDS直連系統(tǒng)通訊層接口設(shè)計(jì)
對(duì)于ECDS直連系統(tǒng)在商業(yè)銀行與前置機(jī)之間的報(bào)文交換,其通訊層的整體架構(gòu)設(shè)計(jì)如圖1所示。
中國(guó)人民銀行ECDS系統(tǒng)與商業(yè)銀行行內(nèi)系統(tǒng)交互數(shù)據(jù)的中間載體為隊(duì)列。對(duì)于行內(nèi)系統(tǒng)發(fā)往前置機(jī)系統(tǒng)的往包,行內(nèi)系統(tǒng)按要求自動(dòng)生成報(bào)文號(hào),并以規(guī)定的順序與格式把往包數(shù)據(jù)通過(guò)商業(yè)銀行電子匯票系統(tǒng)平臺(tái)端API函數(shù)寫(xiě)入消息隊(duì)列。在經(jīng)直連系統(tǒng)轉(zhuǎn)換處理時(shí),該系統(tǒng)再以規(guī)定的格式與順序把往包報(bào)文從該隊(duì)列中讀出并設(shè)計(jì)組包發(fā)送。對(duì)于從前置機(jī)發(fā)往行內(nèi)系統(tǒng)的來(lái)包,直連轉(zhuǎn)換系統(tǒng)以約定的格式和順序?qū)?lái)包內(nèi)容寫(xiě)入隊(duì)列,然后再由商業(yè)銀行的行內(nèi)程序以規(guī)定的格式和順序?qū)⑵鋸年?duì)列中(通過(guò)API)讀出并處理。
對(duì)于AS/400的行內(nèi)主機(jī),隊(duì)列用DTAQ實(shí)現(xiàn),對(duì)于AIX/SCO/HP等其他UNIX平臺(tái)的行內(nèi)主機(jī),隊(duì)列采用文件模擬實(shí)現(xiàn)隊(duì)列的功能。
AS/400的行內(nèi)主機(jī)系統(tǒng)通過(guò)DTAQ與直連轉(zhuǎn)換系統(tǒng)進(jìn)行數(shù)據(jù)交互,直連轉(zhuǎn)換系統(tǒng)不提供隊(duì)列操作的API函數(shù)。對(duì)于AIX/SCO/HP等其他UNIX平臺(tái)的行內(nèi)主機(jī)系統(tǒng),則向行內(nèi)提供直連轉(zhuǎn)換系統(tǒng)API以實(shí)現(xiàn)與隊(duì)列的數(shù)據(jù)交互。
直連系統(tǒng)通過(guò)商業(yè)銀行電子匯票系統(tǒng)平臺(tái)端的API接口與ECDS單一前置機(jī)系統(tǒng)之間進(jìn)行數(shù)據(jù)報(bào)的轉(zhuǎn)發(fā)。而在商業(yè)銀行電子匯票直連系統(tǒng)內(nèi)部,通過(guò)SOCKET設(shè)置其應(yīng)用程序端口,來(lái)實(shí)現(xiàn)行內(nèi)系統(tǒng)與中國(guó)人民銀行ECDS系統(tǒng)平臺(tái)之間的數(shù)據(jù)傳輸。若商業(yè)銀行自身有MQ等消息中間件,則圖1中的通訊模塊可替換為消息中間件的方式實(shí)現(xiàn)行內(nèi)系統(tǒng)與中國(guó)人民銀行ECDS系統(tǒng)平臺(tái)之間的數(shù)據(jù)傳輸。
3 消息隊(duì)列
3.1 分布式消息隊(duì)列的概念
在跨進(jìn)程通信時(shí),通常需要一個(gè)獨(dú)立的載體實(shí)現(xiàn)它們之間的消息傳遞。以隊(duì)列的方式來(lái)傳遞消息既具有數(shù)據(jù)的獨(dú)立性又存在進(jìn)程間的連貫性。無(wú)論是在單機(jī)環(huán)境還是網(wǎng)絡(luò)環(huán)境,它都作為消息的載體,由一個(gè)個(gè)消息串連接而成。在局域網(wǎng)或是廣域網(wǎng)內(nèi),它能夠被所有經(jīng)過(guò)授權(quán)的網(wǎng)絡(luò)節(jié)點(diǎn)所共享,如圖2所示。因此,把這一類消息隊(duì)列稱為分布式消息隊(duì)列[2]。由于消息隊(duì)列的特殊數(shù)據(jù)結(jié)構(gòu),使得分布在網(wǎng)絡(luò)環(huán)境中的各類節(jié)點(diǎn)在進(jìn)行消息傳送時(shí),都具有自己對(duì)數(shù)據(jù)的獨(dú)立管理和訪問(wèn)功能;對(duì)于在C/S網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)訪問(wèn),分布式消息隊(duì)列模式仍然適用。
由于消息隊(duì)列的數(shù)據(jù)傳送要依靠其程序的API接口函數(shù),所以在很多情況下,對(duì)網(wǎng)絡(luò)環(huán)境和單機(jī)環(huán)境API接口的兼容性要求很高。在網(wǎng)絡(luò)環(huán)境下,由于資源共享的優(yōu)勢(shì),服務(wù)器和客戶端需要頻繁傳送消息。該分布式消息隊(duì)列根據(jù)自身獨(dú)立存在的特點(diǎn),能夠?qū)崿F(xiàn)對(duì)數(shù)據(jù)獨(dú)立管理的功能,所以在它的支持下,通訊雙方不必?fù)?dān)心數(shù)據(jù)在通信層的傳送是否發(fā)生錯(cuò)誤,只要專注于自己的業(yè)務(wù)數(shù)據(jù)即可。
3.2 分布式消息隊(duì)列中的API接口功能
行內(nèi)系統(tǒng)與中國(guó)人民銀行前置機(jī)系統(tǒng)之間的數(shù)據(jù)交換,要通過(guò)消息隊(duì)列作為中間載體。在分布式消息隊(duì)列中,提供了大量API接口函數(shù),以此來(lái)訪問(wèn)或操作隊(duì)列上的數(shù)據(jù)。
下面在分布式網(wǎng)絡(luò)環(huán)境下,對(duì)這些API接口功能[3-4]和屬性特征進(jìn)行詳細(xì)描述。
3.2.1 隊(duì)列的打開(kāi)或創(chuàng)建
Mqd_t mq_open(const char*pathname,int oflag,const struct sigevent*notification.../*mode_t mode,struct mq_attr attr/);
對(duì)于任何進(jìn)程訪問(wèn)分布式消息隊(duì)列的第一步就是使用此函數(shù)建立或打開(kāi)一個(gè)消息隊(duì)列,該消息隊(duì)列被打開(kāi)后,除用于消息的發(fā)送與接收外,更重要的是方便日后隊(duì)列的管理。
在上述參數(shù)中pathname表示分布式環(huán)境下消息隊(duì)列的網(wǎng)絡(luò)路徑,oflag用于表示以讀或?qū)懟蜃x寫(xiě)的方式打開(kāi)分布式消息隊(duì)列;當(dāng)實(shí)際要求創(chuàng)建一個(gè)新隊(duì)列時(shí)(如已經(jīng)指定O_CREATE標(biāo)志),mode在用于隊(duì)列管理中起到了用戶身份鑒別的作用,Attr用于說(shuō)明新建隊(duì)列的各類屬性特點(diǎn)。
3.2.2 發(fā)送報(bào)文消息
Int _send_(mqd_t mqdes, unsigned int prio struct mq_attr*attr,const struct sigevent*notification);
當(dāng)消息隊(duì)列被創(chuàng)建或被打開(kāi)后,其結(jié)果會(huì)返回一個(gè)描述字mqdes;創(chuàng)建隊(duì)列的發(fā)送方通過(guò)send函數(shù)對(duì)該描述字所代表的目標(biāo)程序發(fā)送數(shù)據(jù)。當(dāng)然發(fā)送方在發(fā)送數(shù)據(jù)的同時(shí)還可以通過(guò)參數(shù)attr指針來(lái)指定以下選項(xiàng):消息的類型、事務(wù)還是非事務(wù)、傳遞的方式以及是否加密傳輸、是否保存日志等;同時(shí),參數(shù)notification用于表示系統(tǒng)發(fā)送消息時(shí)的方式(同步發(fā)送或異步發(fā)送)。
3.2.3 接收?qǐng)?bào)文消息
Int_receive_from_idsys(char*buf,int sync_flag);
對(duì)于消息隊(duì)列發(fā)送成功的數(shù)據(jù),其目標(biāo)程序所在的接收方,通過(guò)最初創(chuàng)建隊(duì)列時(shí)產(chǎn)生的描述字mqdes,接收?qǐng)?bào)文消息,接收時(shí)需使用receive函數(shù)對(duì)其進(jìn)行檢索篩選。其中參數(shù)buf表示接收到的報(bào)文放入buf中;sync_flag表示接收方檢索的方式,0表示異步接收,1表示同步接收;參數(shù)nonblock表示函數(shù)調(diào)用的方式。
4 異步報(bào)文處理模式
商業(yè)銀行的直連系統(tǒng)與中國(guó)人民銀行 ECDS 系統(tǒng)的報(bào)文交互,其處理流程為:直連系統(tǒng)將待發(fā)的報(bào)文進(jìn)行組裝,并發(fā)送至消息隊(duì)列,經(jīng)中國(guó)人民銀行前置機(jī)系統(tǒng)查詢后,對(duì)其報(bào)文做相應(yīng)的轉(zhuǎn)換處理,發(fā)往中國(guó)人民銀行;同時(shí)中國(guó)人民銀行再通過(guò)前置機(jī)系統(tǒng)將ECDS系統(tǒng)處理的結(jié)果發(fā)送到消息隊(duì)列,最后商業(yè)銀行的直連系統(tǒng)得到消息隊(duì)列的響應(yīng)報(bào)文并進(jìn)行處理。在處理報(bào)文的過(guò)程中,分為實(shí)時(shí)報(bào)文處理和異步報(bào)文處理。
異步處理模式[5]:行內(nèi)發(fā)送服務(wù)可多份(可以和網(wǎng)點(diǎn)交易服務(wù)捆在一起),但行內(nèi)接受服務(wù)必須一個(gè),且能將不同的同步響應(yīng)準(zhǔn)確返回到對(duì)應(yīng)的網(wǎng)點(diǎn)交易服務(wù)。異步模式下,發(fā)送程序成功調(diào)用SEND_TO_IDSYS后,不用等待接收返回的9012報(bào)文,可以直接發(fā)送下一筆報(bào)文,這種模式支持多進(jìn)程同時(shí)發(fā)送,如圖3所示。
在該模式下,一個(gè)完整的發(fā)送流程為:
(1) 組包;
(2) SEND_TO_IDSYS。
其源代碼為:
int SetHeadMsgNo(const char * msg_no);//必選,報(bào)文序號(hào)
int SetHeadMsgIP(const char * msg_ip);//必選,報(bào)文ip地址
int SetHeadMsgId(const char * msg_id);//必選,報(bào)文標(biāo)示號(hào)
int SetHeadRefId(const char *ref_id);//必選,
報(bào)文參考號(hào)
int SetHeadWkdt(const char *wkdt); //必選,
工作日期,yyyymmdd
int SetHeadSndCode(const char *snd_code); //必選 發(fā)起節(jié)點(diǎn)代碼
int SetHeadRcvCode(const char *rcv_code); //必選 接收節(jié)點(diǎn)代碼
int SetHeadAppName(const char*app_name); //必選 應(yīng)用名稱
int SetMsgVer(const char *msg_ver);//設(shè)置報(bào)文版本號(hào)
void SetMsgSndTim(void); //設(shè)置發(fā)送時(shí)間
void SetHeadInOut(const char * in_out);//必選,來(lái)帳往帳標(biāo)識(shí)
功能:設(shè)置報(bào)文頭中字段的相關(guān)信息到buf中;
int SetPkgValue(const char *tag_name, const char *value);
功能:設(shè)置報(bào)文體信息;
void GetPkg(char *out_buf);
功能:獲得要發(fā)送的報(bào)文,獲得的報(bào)文存放在buf中;
int SEND_TO_IDSYS (char *send_buf);
功能:把組好的報(bào)文寫(xiě)入隊(duì)列中。
異步模式下,接收程序調(diào)用RECV_FROM_IDS?鄄
YS時(shí),必須設(shè)sync_flag = 0(或不設(shè)置,缺省值為0),同時(shí)接收程序?qū)呙杞邮贞?duì)列和回應(yīng)隊(duì)列,即會(huì)接收到來(lái)帳指令或往賬的回應(yīng)指令。對(duì)于不同的指令,接收程序必須分別處理。如對(duì)來(lái)賬指令,處理模式不變;對(duì)回應(yīng)指令,則必須通過(guò)報(bào)文參考號(hào)(9012)或回應(yīng)報(bào)文中的其他信息查找到原對(duì)應(yīng)的往賬指令并相應(yīng)處理。一個(gè)完整的接收流程為:
(1) RECV_FROM_IDSYS,sync_flag=0(缺省值);
(2) 解包并處理(包括mbfe返回的9012、來(lái)賬指令、其他異步回應(yīng));
(3) COMMIT_CURRENT_MSG。
5 結(jié)束語(yǔ)
本文所指的ECDS直連系統(tǒng)是商業(yè)銀行行內(nèi)開(kāi)發(fā)的獨(dú)立系統(tǒng),起到行內(nèi)系統(tǒng)與中國(guó)人民銀行ECDS系統(tǒng)之間數(shù)據(jù)交互的橋梁作用,它在通訊層與前置機(jī)之間的數(shù)據(jù)傳輸,本文主要以基于消息隊(duì)列的Socket通訊方式為主。其實(shí),在很多金融信息平臺(tái)中,MQ中間件的應(yīng)用也是很廣泛的,但是MQ中間件更適用于實(shí)時(shí)通訊環(huán)境,而本文對(duì)于報(bào)文的收發(fā)處理,主要以異步處理模式為主,所以Socket通訊方式更為合適。
參考文獻(xiàn):
[1] 于會(huì)軍. 基于商場(chǎng)收銀POS一體化前置機(jī)系統(tǒng)的研究與實(shí)現(xiàn)[D]. 中南大學(xué),2007.
[2] 盧本捷. 分布式消息隊(duì)列的理論、實(shí)現(xiàn)與應(yīng)用[D]. 華中科技大學(xué),2003.
[3] 丁靜. 基于Socket和消息隊(duì)列的中后臺(tái)接口通訊軟件的設(shè)計(jì)[J]. 大連民族學(xué)院學(xué)報(bào),2006(3):65-68.
[4] 李光師. 如何在VB中利用Windows API調(diào)用其他應(yīng)用程序[J]. 鞍山師范學(xué)院學(xué)報(bào),2004(2):69-71.
[5] 何紅波,陸建德,丁衛(wèi)平. 基于中間件MQSeries的消息隊(duì)列異步通信服務(wù)的應(yīng)用研究[J]. 南通大學(xué)學(xué)報(bào):自然科學(xué)版,2006(12):86-89.
(責(zé)任編輯:徐興華)
寧波職業(yè)技術(shù)學(xué)院學(xué)報(bào)2015年4期