王莉



摘 要: 設計了商業銀行行內的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.
(責任編輯:徐興華)