黃群群
【摘要】 在信息系統(tǒng)建設(shè)過程中,數(shù)據(jù)交互是必不可少的一環(huán)。其中與異構(gòu)系統(tǒng)進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)交互,并進(jìn)一步進(jìn)行業(yè)務(wù)處理是最為頻繁的。在一般的處理過程,數(shù)據(jù)的集合和散列往往和業(yè)務(wù)處理耦合在一起,這樣的話就會有很多重復(fù)開發(fā)。本文提出了一個通用的數(shù)據(jù)解析和組合引擎,根據(jù)配置的策略,對接收的數(shù)據(jù)包進(jìn)行解析,對要發(fā)送的數(shù)據(jù)進(jìn)行組合。
【關(guān)鍵詞】 數(shù)據(jù)處理引擎 網(wǎng)絡(luò)協(xié)議處理
在傳統(tǒng)的應(yīng)用網(wǎng)絡(luò)協(xié)議開發(fā)過程中,往往要根據(jù)協(xié)議規(guī)范去進(jìn)行設(shè)計編碼。應(yīng)用協(xié)議多種多樣,信息系統(tǒng)建設(shè)人員對每一個應(yīng)用協(xié)議都會進(jìn)行重新的設(shè)計開發(fā)。要提高開發(fā)的效率,首先就要將網(wǎng)絡(luò)數(shù)據(jù)的接收解碼、編碼發(fā)送從業(yè)務(wù)的邏輯處理中解耦出來。
一、引擎總體架構(gòu)
根據(jù)協(xié)議規(guī)范,數(shù)據(jù)包可劃分為若干域,每個域都可以抽象為某一種域類型。數(shù)據(jù)包中的這些域,有各種各樣的用途,但總體來說可以分為兩類:數(shù)據(jù)域和控制域。整個系統(tǒng)應(yīng)該包括策略配置模塊,引擎模塊,域?qū)ο竽K。其中配置模塊負(fù)責(zé)在初始化階段讀取配置文件,獲得處理策略,引擎模塊根據(jù)這些策略進(jìn)行數(shù)據(jù)處理。
二、域?qū)ο竽K
數(shù)據(jù)包中的域根據(jù)功能劃分,可以分為數(shù)據(jù)域和控制域。數(shù)據(jù)域主要是一些業(yè)務(wù)數(shù)據(jù),不影響數(shù)據(jù)包中其他域的行為??刂朴?,可以對數(shù)據(jù)包的一些行為進(jìn)行控制。
對于一些通用的域類型,系統(tǒng)已經(jīng)提供對應(yīng)的類。而對于外部系統(tǒng)的一些個性化的域,可以擴(kuò)展到域?qū)ο竽K中。所有的域類都應(yīng)該實(shí)現(xiàn)公共接口。該域應(yīng)接口該如下定義:
Class Field
{
Puhlic,:
Parse(char%uf);,/解析
Marshal(char*bllD;/,組包
Verification(char *buf)
Exception0;
Bool IsControlField;//區(qū)分是控制域還是數(shù)據(jù)域
Int size,
}
處理引擎提供若干常用的域類型,每個域類型都繼承這個基類。并可以擴(kuò)展更多域類型??刂朴蝾愋鸵彩抢^承于Field類,但是有更多的操作。定義如下
Class CtrIField:puhlic Field
{
Public.:
Parse(char *buf)
{
}
Marshal(char *buf)
{
}
Char*RcvCtrl(char *huf,int fd);
Char * SendCtrl (char *buf,int fd);
int ParseCtrl(char *buf,int index);
int MarhalCtrl(char *bufint index);
}
其中Rcv Ctrl和SendCtrl在接收和發(fā)送階段對數(shù)據(jù)進(jìn)行控制處理,而ParseCtrl和MarshalCtrl在解析和組合數(shù)據(jù)包過程中進(jìn)行控制處理。所有的控制域都繼承該類。
三、引擎模塊
引擎模塊作為系統(tǒng)的核心部分,從配置模塊獲得對應(yīng)數(shù)據(jù)包類型的策略,根據(jù)策略對接收或者發(fā)送的數(shù)據(jù)包進(jìn)行處理。處理策略其實(shí)就是根據(jù)配置的包的域順序,構(gòu)造的鏈表,引擎根據(jù)該鏈表,順序的取出每個域,并調(diào)用該域的方法。整個策略引擎分為數(shù)據(jù)的接收和發(fā)送過程。
Class Packet
{
Map parse(char*buffer);
Char * marshal (Map map);
Send(char *huffer);
Rcv(char *buffer)
Listlist:,/策略鏈表
Preproc(char* buffer);//預(yù)處理
mProc,(char* buffer);//中處理
Afterproc(Map map);//后處理
List