專利名稱::用于解釋規(guī)范語(yǔ)言文件來(lái)實(shí)現(xiàn)商務(wù)系統(tǒng)的系統(tǒng)和方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及由計(jì)算機(jī)實(shí)現(xiàn)的商務(wù)系統(tǒng),特別地,涉及由用于在銷售點(diǎn)(point-of-sale,POS)處理商務(wù)交易的計(jì)算機(jī)實(shí)現(xiàn)的商務(wù)系統(tǒng)。
背景技術(shù):
:商務(wù)系統(tǒng)可以被描述成為編程來(lái)進(jìn)行商務(wù)交易或功能的計(jì)算機(jī)系統(tǒng)。例如,計(jì)算機(jī)可以用于編程來(lái)接收用戶的輸入,檢測(cè)發(fā)生在特殊環(huán)境下的事件來(lái)記述交易,以及報(bào)導(dǎo)交易事件的日志。管理人員使用這些報(bào)告來(lái)提取關(guān)于商務(wù)操作的信息或修改商務(wù)的不同方面來(lái)改善效率。例如,庫(kù)存管理系統(tǒng)可以由計(jì)算機(jī)組成,該計(jì)算機(jī)被編程來(lái)驗(yàn)證交易,當(dāng)接受產(chǎn)品進(jìn)入庫(kù)存時(shí)對(duì)其進(jìn)行記錄,以及依據(jù)產(chǎn)品從庫(kù)存中的出貨更新產(chǎn)品累計(jì)。用于這些交易的數(shù)據(jù)可以通過(guò)鍵盤或通過(guò)條形碼閱讀器等輸入。該系統(tǒng)可以隨后產(chǎn)生一個(gè)或多個(gè)報(bào)告來(lái)通知管理人員已發(fā)生交易的當(dāng)前存貨水平和容量水平。另一個(gè)常常遇到的商務(wù)系統(tǒng)是結(jié)賬柜臺(tái)(checkoutstation),其通常用在零售銷售點(diǎn)場(chǎng)所。這些銷售點(diǎn)柜臺(tái)可能簡(jiǎn)單如電子收銀機(jī)或復(fù)雜如自助結(jié)賬柜臺(tái)。更復(fù)雜的銷售點(diǎn)系統(tǒng)包括用于操作員輸入命令的小鍵盤,用于讀取條形碼和稱重物品的傳感器,以及數(shù)據(jù)庫(kù)和通信設(shè)備,該數(shù)據(jù)庫(kù)和通信設(shè)備分別用于讀取和存儲(chǔ)數(shù)據(jù)并和遠(yuǎn)程站點(diǎn)進(jìn)行數(shù)據(jù)通信。這些POS系統(tǒng)是眾所周知的。在這些POS柜臺(tái),以掃描來(lái)識(shí)別購(gòu)買的商品。終端可以從中心信息庫(kù)檢索價(jià)格來(lái)支持更有彈性的商品定價(jià)。當(dāng)所有的購(gòu)買物品被提供到銷售點(diǎn)終端時(shí),累加小計(jì),計(jì)算稅金和折扣,并將應(yīng)付的總額顯示給消費(fèi)者。POS終端或柜臺(tái)也可以包括收銀機(jī)功能,信用卡或借記卡閱讀器,或者用于處理交易支付的智能卡接口。在確認(rèn)所提交的付款后,商品發(fā)放給消費(fèi)者。一旦完成了銷售,柜臺(tái)可以和庫(kù)存管理系統(tǒng)進(jìn)行通信來(lái)更新售出物品的庫(kù)存。POS結(jié)賬柜臺(tái)通常包括終端,用于讀取單位價(jià)格代碼并確定商品重量的掃描器/計(jì)量器,收銀員小鍵盤墊和顯示器,用于付款輸入的POS終端,收據(jù)打印機(jī),找零裝置,以及當(dāng)商品已被掃描時(shí)保存商品的結(jié)賬區(qū)域。POS終端也包括顯示器,處理器,存儲(chǔ)器,編程指令,以及控制柜臺(tái)操作的數(shù)據(jù)外圍設(shè)備。編程指令可以包含若干模塊,這些模塊在數(shù)據(jù)庫(kù)中查詢商品價(jià)格,計(jì)算總額,執(zhí)行與通過(guò)結(jié)賬柜臺(tái)購(gòu)買商品相關(guān)的其他功能。某些結(jié)賬柜臺(tái)可能也包括安全應(yīng)用程序,其使用來(lái)自傳感器(例如計(jì)量器和/或攝像頭)的數(shù)據(jù),來(lái)減少在結(jié)賬當(dāng)中發(fā)生不正確的商品替換的可能性。結(jié)賬柜臺(tái)由大量不同的公司制造。雖然POS系統(tǒng)的操作一般是相似的,但是每個(gè)制造商實(shí)現(xiàn)程序代碼來(lái)執(zhí)行交易是不同的。例如,由小鍵盤的鍵產(chǎn)生的代碼或者帶有傳感器系統(tǒng)的接口,對(duì)于不同的制造商可能以略微不同的方式實(shí)現(xiàn)。因此,對(duì)于不同的制造商,由POS系統(tǒng)的一個(gè)或多個(gè)處理器執(zhí)行的程序是不同的。大多數(shù)制造商寧愿以某種模塊化編程來(lái)實(shí)現(xiàn)POS系統(tǒng)控制器,而不采用單一的程序?qū)崿F(xiàn)結(jié)賬柜臺(tái)要求的所有功能性(functionality)。在模塊化編程中,由POS系統(tǒng)實(shí)現(xiàn)的商務(wù)邏輯被分割成子功能。這些子功能可以作為離散的編程對(duì)象或模塊來(lái)實(shí)現(xiàn)。向這些模塊或?qū)ο筇峁┹斎霐?shù)據(jù),該模塊或?qū)ο筇幚磔斎霐?shù)據(jù)來(lái)產(chǎn)生輸出。使用模塊化的編程方法便于實(shí)現(xiàn)計(jì)算機(jī)程序的維護(hù),劃分系統(tǒng)的功能性以使其可以被修改而更容易地引入新功能。雖然上面討論的模塊和對(duì)象確實(shí)利于程序的維護(hù)和適應(yīng)性,它們通常以分層結(jié)構(gòu)結(jié)合在一起來(lái)實(shí)現(xiàn)交易或其它商務(wù)過(guò)程。用于將模塊結(jié)合在一起的分層結(jié)構(gòu)和控制邏輯也以編程語(yǔ)言實(shí)現(xiàn)。實(shí)現(xiàn)控制邏輯和分層結(jié)構(gòu)的編程語(yǔ)句形成了POS系統(tǒng)的框架。這些編程語(yǔ)句必須編譯和安裝在計(jì)算機(jī)上,用來(lái)控制用以實(shí)現(xiàn)POS系統(tǒng)的不同子功能的程序?qū)ο蠛湍K的執(zhí)行。以這種形式實(shí)現(xiàn)POS系統(tǒng)的所有控制邏輯是與模塊化編程的理念背道而馳的。在必須改變控制邏輯來(lái)處理交易的情況下,商務(wù)邏輯的編程語(yǔ)句必須被修改,重新編譯,并重新安裝在執(zhí)行POS系統(tǒng)的計(jì)算機(jī)上。此外,這些改變必須以一種和制造商的執(zhí)行編程邏輯的平臺(tái)兼容的形式被重新編程。也就是,必須以一種和制造商的子功能實(shí)現(xiàn)相兼容的方式修正商務(wù)邏輯。因此,執(zhí)行POS系統(tǒng)的商務(wù)邏輯的控制邏輯的修正需要小心注意系統(tǒng)的硬件環(huán)境以及用于實(shí)現(xiàn)該系統(tǒng)的編程語(yǔ)言。
發(fā)明內(nèi)容一種系統(tǒng),其以提供靈活性而不用必須重新編譯可執(zhí)行的計(jì)算機(jī)邏輯的形式來(lái)控制具有處理器、存儲(chǔ)器和硬盤的商務(wù)系統(tǒng)的操作。該系統(tǒng)包括規(guī)范語(yǔ)言文件,其存儲(chǔ)在硬盤上,該文件包含定義商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn)的規(guī)范語(yǔ)言語(yǔ)句;解析器,用于從規(guī)范語(yǔ)言文件中提取規(guī)范語(yǔ)言語(yǔ)句并解釋所提取的規(guī)范語(yǔ)言語(yǔ)句;商務(wù)邏輯應(yīng)用程序,其包括商務(wù)邏輯模塊,該商務(wù)邏輯模塊包含可執(zhí)行的編譯程序語(yǔ)句;以及,解析器調(diào)用至少一個(gè)商務(wù)邏輯模塊來(lái)處理解析器從規(guī)范語(yǔ)言文件中提取的消息。一種方法,能通過(guò)以提供靈活性而不用必須重新編譯可執(zhí)行計(jì)算機(jī)邏輯的方式來(lái)控制商務(wù)系統(tǒng)的操作的這樣的系統(tǒng)來(lái)實(shí)現(xiàn)。該方法包括以規(guī)范語(yǔ)言語(yǔ)句定義商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn);解釋規(guī)范語(yǔ)言語(yǔ)句來(lái)實(shí)現(xiàn)商務(wù)系統(tǒng);以及,調(diào)用包含可執(zhí)行編譯程序語(yǔ)句的商務(wù)邏輯模塊來(lái)處理解析器從所解釋的規(guī)范語(yǔ)言語(yǔ)句中提取的消息。下面將結(jié)合附圖和示意性實(shí)施例詳細(xì)討論本系統(tǒng)和方法的優(yōu)點(diǎn)和特征。在本發(fā)明中描述的系統(tǒng)和方法可以以不同的組成,組成的布置以及在不同的方法來(lái)具體化。附圖僅出于用于說(shuō)明優(yōu)選實(shí)施例及其替換方案的目的,不能被認(rèn)為構(gòu)成對(duì)本發(fā)明的限制。圖1示出了結(jié)賬柜臺(tái)的透視圖,該柜臺(tái)具有用于實(shí)現(xiàn)商務(wù)邏輯和結(jié)賬柜臺(tái)的規(guī)范語(yǔ)言文件解釋器。圖2是系統(tǒng)的框圖,其使用規(guī)范語(yǔ)言解釋器來(lái)實(shí)現(xiàn)系統(tǒng)的商務(wù)邏輯。圖3是可擴(kuò)展標(biāo)記語(yǔ)言文件結(jié)構(gòu)的例子,其可以用于定義狀態(tài)機(jī)。圖4是庫(kù)定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖5是定時(shí)器定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖6是常量定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖7是變量定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖8是狀態(tài)定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖9是消息定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖10是動(dòng)作定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖11是查找表定義的例子,其可以用于圖3的文件結(jié)構(gòu)。圖12是if表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖13是else表達(dá)式的例子,其可以用于圖12的if表達(dá)式。圖14是else-if表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖15是select表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖16是when表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖17是otherwise表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖18是for表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖19是while表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖20是timeout-rule-list表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖21是break表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖22是yield表達(dá)式的例子,其可以用于圖3的文件結(jié)構(gòu)。圖23是斷言對(duì)話框的例子,其可以用于狀態(tài)機(jī)的實(shí)現(xiàn)。圖24是數(shù)據(jù)模型資源管理器的例子,其可以用于圖3的文件結(jié)構(gòu)。圖25是用于狀態(tài)機(jī)實(shí)現(xiàn)的非瞬態(tài)類的示例集的類圖(classdiagram)。圖26是用于解析圖3的文件結(jié)構(gòu)的瞬態(tài)類的類圖。圖27是可以用于狀態(tài)機(jī)實(shí)現(xiàn)的Java支持的類的類圖。具體實(shí)施例方式根據(jù)本發(fā)明的原理修改的結(jié)賬柜臺(tái)如圖1所示。結(jié)賬柜臺(tái)10可以包括饋送單元14和驗(yàn)貨臺(tái)18。饋送器單元14包括饋送帶20和用于放置操作饋送帶20的電動(dòng)機(jī)和控制電路的殼體22。饋送單元14可移動(dòng)地結(jié)合在驗(yàn)貨臺(tái)18上以使得饋送帶可以和掃描器/計(jì)量器單元26對(duì)齊。驗(yàn)貨臺(tái)18包括掃描器/計(jì)量器單元26,消費(fèi)者終端34,用于輸入付款數(shù)據(jù)的付款終端38,以及收據(jù)打印機(jī)44。掃描器/計(jì)量器單元26使用照射在玻璃或其他透明的臺(tái)板(platen)上的激光來(lái)輸入來(lái)自產(chǎn)品或包裝上的條形碼上的數(shù)據(jù)。單元26也可以包括用于測(cè)量商品重量的計(jì)量器,該商品以價(jià)格每重量單位為基礎(chǔ)銷售。消費(fèi)者終端34當(dāng)使商品進(jìn)入通過(guò)掃描器/計(jì)量器單元26時(shí)顯示商品數(shù)據(jù)。付款終端38可以是任何已知的POS終端,其結(jié)合閱讀器32以支持信用卡,借記卡以及其他支付方法。收據(jù)打印機(jī)44向消費(fèi)者提供逐條列記所購(gòu)商品和支付方法的收據(jù)。收據(jù)打印機(jī)44和掃描器/計(jì)量器單元26可以由在其底面具有安全計(jì)量器48的囊井(Bagwell)46分開(kāi)。用于存放消費(fèi)者的、已掃描和稱重的商品的購(gòu)物袋掛在囊井46中的懸掛橫桿50上。安全計(jì)量器48使用從掃描器/計(jì)量器26得到的商品重量數(shù)據(jù)、或者從使用掃描單位商品碼(unitproductcode,UPC)的數(shù)據(jù)庫(kù)得到的商品重量數(shù)據(jù),來(lái)驗(yàn)證僅僅只有已掃描過(guò)的商品被放置在安全計(jì)量器上。運(yùn)行在終端34的安全應(yīng)用程序監(jiān)視安全計(jì)量器48來(lái)確定是否將沒(méi)有掃描的商品增加到安全計(jì)量器區(qū)域。通過(guò)使三色指示器中的警告或告警燈的顏色變亮來(lái)發(fā)信號(hào)告知需要調(diào)查的異常情況,該指示器安裝在驗(yàn)貨臺(tái)18的指示器桿52的終端的末端上。安全攝像頭56可以安裝在指示器桿52上用于產(chǎn)生對(duì)應(yīng)于驗(yàn)貨臺(tái)區(qū)域的視頻數(shù)據(jù)。數(shù)據(jù)庫(kù),磁盤驅(qū)動(dòng)器,或柜臺(tái)操作所需要的其他計(jì)算機(jī)外圍設(shè)備可以放置在位于驗(yàn)貨臺(tái)18內(nèi)的外圍設(shè)備托盤60中。驗(yàn)貨臺(tái)18還包括上部貨幣模塊40,用于接收來(lái)自于消費(fèi)者的紙幣和硬幣作為交易的付款。模塊40還包括硬幣分配器36,用于返還消費(fèi)者找零的硬幣部分,而下部貨幣模塊42用于返還消費(fèi)者找零的紙幣部分。模塊40也可以包括現(xiàn)金再循環(huán)單元(圖未示)來(lái)以分發(fā)給消費(fèi)者零錢的形式提供從消費(fèi)者接受的現(xiàn)金。如圖1所示,消費(fèi)者可以將商品放置在饋送帶20上,傳送帶20被驅(qū)動(dòng)將商品帶至饋送帶20的末端,在那里關(guān)閉機(jī)構(gòu)使饋送帶20停止。然后消費(fèi)者可以從傳送帶20上取下商品并一次一個(gè)地將它們移動(dòng)到用于商品產(chǎn)品數(shù)據(jù)的檢索和/或稱重的掃描器/計(jì)量器26上。可任選的,消費(fèi)者可以拉著裝有購(gòu)買商品的手推車,使其與饋送單元22相鄰,并且將手推車中的商品放置在掃描器/計(jì)量器26上。然后掃描過(guò)的商品被放置在掃描器/計(jì)量器26上的購(gòu)物袋中。一旦完成所有商品的掃描,消費(fèi)者可以通過(guò)支付終端38或貨幣模塊40進(jìn)行付款,從模塊42接受找零,并從打印機(jī)44接受收據(jù)。然后消費(fèi)者可以從安全計(jì)量器48上取走購(gòu)物袋,離開(kāi)柜臺(tái)10。結(jié)賬柜臺(tái)10的操作由通常結(jié)合在終端34內(nèi)的處理器控制。圖2示出了可以用于操作商務(wù)邏輯系統(tǒng)的狀態(tài)機(jī)的實(shí)現(xiàn)的系統(tǒng)框圖。系統(tǒng)100包含狀態(tài)機(jī)定義104,其可以存儲(chǔ)在硬盤中;解析器(parser)108,用于從狀態(tài)機(jī)定義104中提取規(guī)范語(yǔ)言語(yǔ)句并且解釋所提取的規(guī)范語(yǔ)言語(yǔ)句;以及,商務(wù)邏輯應(yīng)用程序110,包含商務(wù)邏輯模塊。商務(wù)邏輯模塊包括可執(zhí)行的編譯程序語(yǔ)句,其可以被表示為下文更詳細(xì)描述的動(dòng)作(action)。解析器調(diào)用商務(wù)應(yīng)用程序110的商務(wù)邏輯模塊來(lái)處理由解析器從狀態(tài)機(jī)定義的規(guī)范語(yǔ)言語(yǔ)句中提取的消息。規(guī)范語(yǔ)言語(yǔ)句優(yōu)選地包含在規(guī)范語(yǔ)言文件中。這些語(yǔ)句定義了商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn)。更詳細(xì)地,商務(wù)系統(tǒng)(比如將在下面更詳細(xì)描述的結(jié)賬柜臺(tái))的規(guī)范語(yǔ)言定義,使用由銷售點(diǎn)(POS)系統(tǒng)的制造商為結(jié)賬柜臺(tái)提供的數(shù)據(jù)鏈接庫(kù)(datalinklibrary,DLL)。由規(guī)范語(yǔ)言語(yǔ)句定義的狀態(tài)機(jī)實(shí)現(xiàn),使用包含在DLL中的商務(wù)邏輯模塊來(lái)操作結(jié)賬柜臺(tái)。這些模塊是編譯的、可執(zhí)行的計(jì)算機(jī)代碼,該計(jì)算機(jī)代碼由結(jié)賬柜臺(tái)的制造商開(kāi)發(fā)。這些模塊實(shí)現(xiàn)系統(tǒng)的操作,例如,讀取條形碼,累計(jì)和匯總銷售交易,稱重貨物,處理付款,以及發(fā)放收據(jù)。在結(jié)賬系統(tǒng)中組織這些功能的商務(wù)邏輯,根據(jù)由規(guī)范語(yǔ)言語(yǔ)句定義的狀態(tài)機(jī)實(shí)現(xiàn)來(lái)執(zhí)行。狀態(tài)機(jī)實(shí)現(xiàn)也可以由其他的規(guī)范語(yǔ)言文檔和/或用戶化的DLL來(lái)補(bǔ)充。如下文中更詳細(xì)地描述的,系統(tǒng)初始化一旦發(fā)生,解析器便開(kāi)始從規(guī)范語(yǔ)言文件中提取規(guī)范語(yǔ)言語(yǔ)句。解析器解釋所提取的規(guī)范語(yǔ)言語(yǔ)句。此解釋包括通過(guò)規(guī)范語(yǔ)言語(yǔ)句的標(biāo)簽(tag)識(shí)別規(guī)范語(yǔ)言語(yǔ)句,如下文中更詳細(xì)描述的,以及調(diào)用對(duì)在已解釋的規(guī)范語(yǔ)言語(yǔ)句中識(shí)別的商務(wù)邏輯模塊的調(diào)用。如下文中更詳細(xì)地描述的,這些商務(wù)邏輯模塊可以由編程語(yǔ)言對(duì)象來(lái)實(shí)現(xiàn)。這些對(duì)象可能包括若干方法,解析器調(diào)用這些方法來(lái)處理從規(guī)范語(yǔ)言語(yǔ)句中提取的數(shù)據(jù),例如消息。這些對(duì)象用于實(shí)現(xiàn)動(dòng)作,其是用于操作該系統(tǒng)的商務(wù)邏輯的最小單元。因此,規(guī)范語(yǔ)言文件為定義結(jié)賬柜臺(tái)操作所要求的商務(wù)邏輯提供框架,DLL的模塊或?qū)ο髣t為實(shí)現(xiàn)商務(wù)邏輯提供必要的可執(zhí)行的計(jì)算機(jī)代碼。這個(gè)結(jié)構(gòu)便于結(jié)賬柜臺(tái)操作的修改和維護(hù)。特別地,結(jié)賬柜臺(tái)的操作可以通過(guò)僅僅改變規(guī)范語(yǔ)言語(yǔ)句而不用在計(jì)算機(jī)上重新編譯和安裝可執(zhí)行代碼來(lái)進(jìn)行修改。下面將更詳細(xì)地描述結(jié)賬柜臺(tái)的實(shí)現(xiàn)。在該實(shí)現(xiàn)中,將描述用于控制結(jié)賬柜臺(tái)操作的狀態(tài)機(jī)的生成和狀態(tài)機(jī)的初始化。然后提供關(guān)于規(guī)范語(yǔ)言語(yǔ)句的結(jié)構(gòu)的細(xì)節(jié),包括將規(guī)范語(yǔ)言語(yǔ)句組織成表達(dá)式。為了在規(guī)范語(yǔ)言語(yǔ)句中定位表達(dá)式標(biāo)簽并根據(jù)定位的表達(dá)式標(biāo)簽解釋對(duì)應(yīng)的標(biāo)簽之間的規(guī)范語(yǔ)言語(yǔ)句,這些表達(dá)式可以由結(jié)合在解析器內(nèi)的表達(dá)式解釋器來(lái)解釋。方法調(diào)用器(methodinvoker)也可以結(jié)合在解析器中,用于調(diào)用商務(wù)邏輯模塊來(lái)處理從規(guī)范語(yǔ)言文件中提取的信息。將詳細(xì)描述關(guān)于結(jié)賬柜臺(tái)所實(shí)現(xiàn)的動(dòng)作。也會(huì)在這里描述額外的特征,這些額外的特征用于調(diào)試狀態(tài)機(jī)實(shí)現(xiàn),為實(shí)現(xiàn)動(dòng)作的類提供JAVA支持,以及對(duì)狀態(tài)機(jī)實(shí)現(xiàn)進(jìn)行群集(cluster)來(lái)擴(kuò)大商務(wù)系統(tǒng)操作。生成一個(gè)狀態(tài)機(jī)的實(shí)例來(lái)操作商務(wù)系統(tǒng)。為了生成狀態(tài)機(jī)的實(shí)例,可以通過(guò)參數(shù)列表來(lái)調(diào)用CStateMachineFactory對(duì)象的靜態(tài)工廠方法BuildStateMachine。CStateMachineFactory對(duì)象是由商務(wù)系統(tǒng)平臺(tái)(例如結(jié)賬柜臺(tái))的制造商提供的編程語(yǔ)言對(duì)象。用于該方法調(diào)用的參數(shù)包括狀態(tài)機(jī)的唯一名稱,以及包含狀態(tài)機(jī)定義、庫(kù)名稱和目錄路徑的統(tǒng)一資源定位符(URLUniversalResourceLocater)。狀態(tài)機(jī)定義用于生成狀態(tài)機(jī)的數(shù)據(jù)值和規(guī)則集。庫(kù)名稱優(yōu)選地包含返回狀態(tài)機(jī)實(shí)例的實(shí)際工廠方法(actualfactorymethod)。目錄路徑包含由工廠在生成狀態(tài)機(jī)時(shí)載入的所有文件。BuildStateMachine方法從CStateMachineFactory對(duì)象的返回,提供了要求初始化的完全功能狀態(tài)機(jī)。在生成狀態(tài)機(jī)的過(guò)程中,工廠對(duì)象使用加載器類的實(shí)例,例如CSMLoader或者它的一個(gè)派生物,來(lái)加載狀態(tài)機(jī)的例子。這個(gè)類使用SAXParser(SAX解析器)實(shí)現(xiàn)來(lái)將規(guī)范語(yǔ)言解析成適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu),例如表達(dá)式。如下面將更充分討論的,優(yōu)選的規(guī)范語(yǔ)言文件是以可擴(kuò)展標(biāo)記語(yǔ)言(XML)編寫(xiě)的。SAXParser用于分析狀態(tài)機(jī)定義文件的XML來(lái)操作狀態(tài)機(jī)。一些單獨(dú)分開(kāi)的標(biāo)簽由例如為CContentHandler的內(nèi)容處理器類(contenthandlerclass)的實(shí)現(xiàn)來(lái)處理。在構(gòu)建時(shí),生成使每個(gè)標(biāo)簽和其對(duì)應(yīng)的處理器類相互關(guān)聯(lián)的映射。通過(guò)使用XPath表達(dá)式作為關(guān)鍵碼(key)來(lái)實(shí)現(xiàn)這個(gè)映射。XPath表達(dá)式通過(guò)將正斜杠“/”和標(biāo)簽名稱連接直到檢測(cè)到停止標(biāo)簽來(lái)構(gòu)建。因此,標(biāo)簽名稱和與它相關(guān)的正斜杠符號(hào)被移除,直到到達(dá)最后的停止標(biāo)簽。隨著SAXParser解析規(guī)范語(yǔ)言文件,其證實(shí)了語(yǔ)句的結(jié)構(gòu)。在示例的XML規(guī)范文件中可能遇到的語(yǔ)句結(jié)構(gòu)將在下面更詳細(xì)描述。在結(jié)構(gòu)證實(shí)中檢測(cè)到的錯(cuò)誤將在錯(cuò)誤日志中報(bào)道。生成包含在錯(cuò)誤日志中的錯(cuò)誤消息的處理器可以檢測(cè)(1)狀態(tài)、消息、動(dòng)作、常量、定時(shí)器或變量的重復(fù)定義;(2)未定義的狀態(tài)、消息、動(dòng)作、常量、定時(shí)器或變量;(3)狀態(tài)、消息、動(dòng)作、常量、定時(shí)器或變量的無(wú)效名稱;(4)不兼容的標(biāo)簽選項(xiàng)。由規(guī)范語(yǔ)言文件定義的狀態(tài)機(jī)實(shí)現(xiàn)可以包括用戶化的DLL。狀態(tài)機(jī)的工廠實(shí)現(xiàn)在這些DLL中搜索入口點(diǎn)的數(shù)目,每個(gè)入口點(diǎn)可任選地被提供。工廠對(duì)象為DLL沒(méi)有定義的任何入口點(diǎn)使用默認(rèn)實(shí)現(xiàn)。如下所述,這些入口點(diǎn)可能是C型入口點(diǎn)。這些入口點(diǎn)為以下提供支持(1)注冊(cè)/不注冊(cè)被支持的動(dòng)作名稱;(2)生成/銷毀狀態(tài)機(jī)實(shí)例;以及(3)生成/銷毀任何需要的Plugin對(duì)象。也可以使用模板方法來(lái)支持動(dòng)作的生成/銷毀??梢蕴峁┤缦氯肟邳c(diǎn)在動(dòng)作注冊(cè)/不注冊(cè)中的第一個(gè)入口點(diǎn),返回由庫(kù)所支持的所有動(dòng)作的名稱列表。當(dāng)生成庫(kù)時(shí)的初始化過(guò)程中,其被調(diào)用一次。入口點(diǎn)的簽名是HRESULT_declspec(dllexport)RegisterAll(const_TCHAR***,HTRACE)該調(diào)用的第一個(gè)參數(shù)是指向數(shù)組名稱的指針的地址。這個(gè)數(shù)組通過(guò)該調(diào)用返回,但是不能被釋放。第二個(gè)參數(shù)是追蹤對(duì)象的句柄(handle)。當(dāng)狀態(tài)機(jī)處于被銷毀的過(guò)程中時(shí),釋放這些名稱。為了便于其實(shí)現(xiàn),狀態(tài)機(jī)調(diào)用下面的入口點(diǎn)void_declspec(dllexport)UnregisterAll()可以看到,這個(gè)入口點(diǎn)沒(méi)有攜帶任何參數(shù),所以不返回值。狀態(tài)機(jī)工廠創(chuàng)建/銷毀類別中的第一個(gè)入口點(diǎn)返回指向CStateMachineFacory的實(shí)例的指針。其由CStateMachineFacory在初始化的過(guò)程中被調(diào)用一次。入口點(diǎn)的簽名是HRESULT_declspec(dllexport)BuildStateMachineFactory(HTRACEhTrace,STATE_MACHINE_NAMESPACE::CStateMachineFactory**)該方法采用兩個(gè)參數(shù),也就是,追蹤對(duì)象的句柄以及指向新構(gòu)造的工廠狀態(tài)機(jī)的返回指針的地址。如果在生成的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。在這一類別的第二個(gè)入口點(diǎn)用于在結(jié)束時(shí)釋放狀態(tài)機(jī)工廠。它的簽名是HRESULT_declspec(dllexport)ReleaseStateMachineFactory(HTRACEhTrace,STATE_MACHINE_NAMESPACE::CStateMachineFactory*)該方法采用兩個(gè)參數(shù),也就是,追蹤對(duì)象的句柄以及指向要銷毀的工廠狀態(tài)機(jī)的指針。如果在銷毀的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。如果對(duì)這些可任選的方法未加聲明,則將生成CStateMachineFactory的默認(rèn)實(shí)例。狀態(tài)機(jī)加載器創(chuàng)建/銷毀類別中的第一個(gè)入口點(diǎn)返回指向CSMLoader的實(shí)例的指針。其由CStateMachineFacory使用來(lái)構(gòu)建和初始化所要求的狀態(tài)機(jī)實(shí)例。入口點(diǎn)的簽名是HRESULT_declspec(dllexport)BuildStateMachineLoader(HTRACEhTrace,STATE_MACHINE_NAMESPACE::CSMLoader**)該方法采用兩個(gè)參數(shù),也就是,追蹤對(duì)象的句柄以及指向新構(gòu)造的CSMLoader實(shí)例的返回指針的地址。如果在生成的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。在這一類別的第二個(gè)入口點(diǎn)用于在結(jié)束的時(shí)候釋放狀態(tài)機(jī)加載器。它的簽名是HRESULT_declspec(dllexport)ReleaseStateMachineLoader(HTRACEhTrace,STATE_MACHINE_NAMESPACE::CSMLoader**)該方法采用兩個(gè)參數(shù),也就是,追蹤對(duì)象的句柄以及指向要銷毀的狀態(tài)機(jī)加載器的指針。如果在銷毀的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。如果對(duì)這些可任選的方法未加聲明,則將生成CSMLoader的默認(rèn)實(shí)例。狀態(tài)機(jī)創(chuàng)建/銷毀類別中的第一個(gè)入口點(diǎn)返回指向狀態(tài)機(jī)的實(shí)例的指針。其由CStateMachineFacory在初始化的過(guò)程中被調(diào)用一次。入口點(diǎn)的簽名是HRESULT_declspec(dllexport)BuildStateMachine(const_TCHAR*HTRACEhTraceSTATE_MACHINE_NAMESPACE::IStateMachine**)該方法采用三個(gè)參數(shù),它們是XML文件的URL,追蹤對(duì)象的句柄以及指向新構(gòu)造的狀態(tài)機(jī)的返回指針的地址。如果在生成的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。在這一類別的第二個(gè)入口點(diǎn)用于在結(jié)束的時(shí)候釋放狀態(tài)機(jī)。它的簽名是HRESULT_declspec(dllexport)ReleaseStateMachine(HTRACEhTrace,STATE_MACHINE_NAMESPACE::IStateMachine*)該方法采用兩個(gè)參數(shù),它們是追蹤對(duì)象的句柄以及指向要銷毀的狀態(tài)機(jī)的指針。如果在銷毀的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。群集創(chuàng)建/銷毀類別中的第一個(gè)入口點(diǎn)返回指向由兩個(gè)或更多協(xié)同操作狀態(tài)機(jī)組成的狀態(tài)機(jī)的實(shí)例的指針。其由CStateMachineFacory在初始化的過(guò)程中調(diào)用一次。入口點(diǎn)的簽名是HRESULT_declspec(dllexport)BuildCluster(const_TCHAR*HTRACEhTraceSTATE_MACHINE_NAMESPACE::CCluster**)該方法采用三個(gè)參數(shù)XML文件的URL,追蹤對(duì)象的句柄以及指向新構(gòu)造的狀態(tài)機(jī)群集的返回指針的地址。如果在構(gòu)造的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。在這一類別中的第二個(gè)入口點(diǎn)用于在結(jié)束的時(shí)候釋放狀態(tài)機(jī)。它的簽名是HRESULT_declspec(dllexport)ReleaseCluster(HTRACEhTrace,STATE_MACHINE_NAMESPACE::CCluster**);該方法采用兩個(gè)參數(shù)追蹤對(duì)象的句柄,以及指向要銷毀的狀態(tài)機(jī)群集的指針。如果在銷毀的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。在Plugin創(chuàng)建/銷毀類別的第一個(gè)入口點(diǎn)返回指向工廠對(duì)象的實(shí)例的指針,其提供了以新的標(biāo)簽來(lái)擴(kuò)展?fàn)顟B(tài)機(jī)定義語(yǔ)言的機(jī)制。其由CStateMachineFacory在初始化的過(guò)程中被調(diào)用一次。入口點(diǎn)的簽名是HRESULT_declspec(dllexport)GetPlugin(const_TCHAR*,IPlugin**,HTRACE)。該方法采用三個(gè)參數(shù)Plugin的符號(hào)名稱,指向新構(gòu)造的IPlugin對(duì)象的返回指針的地址,以及追蹤對(duì)象的句柄。如果在構(gòu)造的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。在這一類別中的第二個(gè)入口點(diǎn)用于在結(jié)束的時(shí)候釋放Plugin對(duì)象。它的簽名是HRESULT_declspec(dllexport)ReleasePlugin(IPlugin*,HTRACE)。該方法采用兩個(gè)參數(shù)指向要銷毀的IPlugin的指針,以及追蹤對(duì)象的句柄。如果在銷毀的過(guò)程中沒(méi)有發(fā)生錯(cuò)誤,則入口點(diǎn)返回S_OK。任何其他值都是錯(cuò)誤。對(duì)于在DLL中揭露的每個(gè)動(dòng)作都有兩個(gè)動(dòng)作工廠方法入口點(diǎn)。這一類別中的兩個(gè)入口點(diǎn)應(yīng)該和動(dòng)作本身一樣由包括在相同文件中的注冊(cè)宏生成。例如,在狀態(tài)機(jī)中有叫做CSendMsg的動(dòng)作。在Sendmsg.cpp文件的底部有如下代碼REGISTER_SM_ACTION(SendMsg)。宏REGISTER_SM_ACTION本身在文件ActionBase.h中定義為#defineSM_REGISTRATION_PREFIXSM.#defineREGISTER_SM_ACTION(NAME)\DECLARE_CLASS_CREATION_DESTRUCTION(NAME)\DECLARE_REGISTRATION_CLASS(SM_REGISTRATION_PREFIX,NAME)\DEFINE_REGISTRATION(NAME)這些宏為動(dòng)作自動(dòng)生成所要求的入口點(diǎn)并且將它們揭露給CRegistrationManager。狀態(tài)機(jī)的每個(gè)組分用戶(componentuser)創(chuàng)建唯一的注冊(cè)宏和注冊(cè)前綴,并且對(duì)定義在DLL中的所有動(dòng)作使用這樣的宏。該類別中的第一個(gè)入口點(diǎn)返回指向新創(chuàng)建的類型T的動(dòng)作的指針。該入口點(diǎn)是靜態(tài)模板成員功能(statictemplatememberfunction)。它由CXMLStateMachine工廠調(diào)用來(lái)生成動(dòng)作。入口點(diǎn)的簽名是IACTION*CCreateable<T,IAction>::Newlnstance()。在這一類別中的第二個(gè)入口點(diǎn)用于釋放由上面的入口點(diǎn)生成的動(dòng)作。它的簽名是voidCCreateable<T,IAction>::Releaselnstance(IAction*)。這個(gè)方法將動(dòng)作的地址作為參數(shù)來(lái)釋放。根據(jù)BuildStateMachine方法的返回,通過(guò)調(diào)用返回的狀態(tài)機(jī)的實(shí)例的Start(啟動(dòng))方法來(lái)完成初始化。該方法由新的工作線程(workerthread)參數(shù)調(diào)用,該參數(shù)用于運(yùn)行狀態(tài)機(jī)。所有的狀態(tài)機(jī)動(dòng)作都使用這個(gè)工作線程來(lái)執(zhí)行。狀態(tài)機(jī)處理消息并且執(zhí)行規(guī)則。消息處理可以是異步的,也可以是同步的。消息處理和規(guī)則集執(zhí)行都由狀態(tài)機(jī)元素完成。消息處理,規(guī)則集執(zhí)行,以及執(zhí)行這些任務(wù)的狀態(tài)機(jī)元素將在下面詳細(xì)描述。狀態(tài)機(jī)通過(guò)接收消息以及響應(yīng)執(zhí)行規(guī)則集進(jìn)行操作。通過(guò)使用用于異步操作的PostMsg方法或使用用于同步操作的SendMsg方法來(lái)在CSynchronizedQueue中放置消息,以此協(xié)調(diào)狀態(tài)機(jī)的執(zhí)行。對(duì)于異步操作,PostMsg不等待返回代碼。對(duì)于同步操作,SendMsg方法等到消息的最后一個(gè)動(dòng)作處理完畢,并返回由規(guī)則集設(shè)定的某一返回代碼。工作線程從CSynchronizedQueue中移除消息,并對(duì)于處于全局狀態(tài)的消息,確定是否存在規(guī)則集。如果對(duì)于消息存在規(guī)則集,那么先運(yùn)行這個(gè)規(guī)則集。該規(guī)則集可以不從當(dāng)前狀態(tài)轉(zhuǎn)變。工作線程然后對(duì)于處于當(dāng)前狀態(tài)的消息確定是否存在規(guī)則集。如果有,則執(zhí)行該規(guī)則集。如果沒(méi)有,則工作線程對(duì)于處于被稱為“any”狀態(tài)的特殊狀態(tài)的消息確定是否存在規(guī)則集,該狀態(tài)在XML定義中用狀態(tài)名“*”表示。執(zhí)行所發(fā)現(xiàn)為“any”狀態(tài)的任何規(guī)則集。如果沒(méi)有發(fā)現(xiàn)規(guī)則集,則該消息轉(zhuǎn)到可以處理或不處理該消息的默認(rèn)處理器方法(defaulthandlermethod)?;緺顟B(tài)機(jī)的默認(rèn)處理器僅僅記錄一個(gè)條目表示忽略該消息。狀態(tài)機(jī)群集的默認(rèn)處理器將消息傳至群集中能夠處理該消息的任何其他狀態(tài)機(jī)。規(guī)則集包括零或多個(gè)IAction,以及零或多個(gè)至其他狀態(tài)的轉(zhuǎn)變。IAction為狀態(tài)機(jī)元素,將在下面詳細(xì)討論。如果存在IAction,它們將依序執(zhí)行直到下列情況之一發(fā)生IAction返回假(false),IAction引起異常發(fā)生(故障),或者序列中不再有IAction。在IAction返回假的情況下,規(guī)則集可以指定要執(zhí)行的假動(dòng)作(falseaction),其也可以指定到另一個(gè)狀態(tài)的轉(zhuǎn)變。當(dāng)發(fā)生異常的情況,狀態(tài)機(jī)捕獲該異常,記錄該異常,執(zhí)行規(guī)則集指定的任意可任選的故障動(dòng)作,或者任意地轉(zhuǎn)變到規(guī)則集指定的故障狀態(tài)。當(dāng)序列中不再有IAction時(shí),規(guī)則集可任選地指定轉(zhuǎn)變至新的狀態(tài)。異步消息處理是狀態(tài)機(jī)的正常的操作模式。通過(guò)調(diào)用PostMsg方法可以使消息異步。從PostMsg的返回是即時(shí)的。在將來(lái)的某一時(shí)間,將處理剛發(fā)的消息。也提供了同步消息處理,但是由于潛在的死鎖的可能性而只是以受限的方式使用同步消息處理。任何生成消息的動(dòng)作都可能潛在地引起死鎖。通過(guò)調(diào)用SendMsg來(lái)同步處理消息。當(dāng)在隊(duì)列中加入同步消息時(shí),調(diào)用線程進(jìn)入等待狀態(tài)。當(dāng)對(duì)給定消息執(zhí)行了所有動(dòng)作時(shí),狀態(tài)機(jī)發(fā)信號(hào)給正在等待的線程。狀態(tài)機(jī)使用的所有元素由實(shí)現(xiàn)成為抽象基類的一系列接口在外部表示(內(nèi)部由CAbstractStateMachine表示),每一個(gè)接口代表狀態(tài)機(jī)的不同方面??偟膩?lái)說(shuō),所有的外部表示都是只讀的,不能提供任何修改機(jī)制?,F(xiàn)在討論這些元素。接口IStateMachine代表狀態(tài)機(jī)本身。它提供了以只讀方式訪問(wèn)狀態(tài)機(jī)的不同元素的一組方法。所有的實(shí)現(xiàn)細(xì)節(jié)都不顯示給這一類的用戶。除非另外提供,動(dòng)作僅僅通過(guò)這一接口訪問(wèn)狀態(tài)機(jī)。IMessage接口提供狀態(tài)機(jī)輸入的只讀表示,該狀態(tài)機(jī)用于確定執(zhí)行的規(guī)則集。每個(gè)IMessage由其名稱唯一識(shí)別。該名稱為狀態(tài)機(jī)內(nèi)二維映射提供第一個(gè)關(guān)鍵碼。IMessage名稱可以包含除了已經(jīng)在XML解析器中用作定界符的字符外的任意字符。無(wú)效字符包括‘<’,‘>’和‘&’。IState接口提供狀態(tài)的只讀表示,狀態(tài)機(jī)可以駐留在這些狀態(tài)中。每個(gè)IState由其名稱唯一識(shí)別。該名稱為狀態(tài)機(jī)內(nèi)二維映射提供第二個(gè)關(guān)鍵碼。IMessage名稱可以包含除了已經(jīng)在XML解析器中用作定界符的字符外的任意字符。無(wú)效字符包括‘<’,‘>’和‘&’。IAction接口代表最小的工作單元,也就是,能夠響應(yīng)于狀態(tài)機(jī)中的輸入而執(zhí)行的商務(wù)邏輯。該表示是只讀的。總的來(lái)說(shuō),IAction的實(shí)現(xiàn)是小型的,并且不能包含一個(gè)以上的功能。這個(gè)限制允許IAction在其他規(guī)則集中的重用。此外,IAction越小,它越容易調(diào)試和維護(hù)。每個(gè)IAction由一個(gè)名稱表示。該名稱在單個(gè)ILigrary中是唯一的。IAction名稱可以只包含字母數(shù)字字符。為了進(jìn)一步區(qū)分動(dòng)作和防止名稱沖突,可以將動(dòng)作駐留于名稱空間。在這種情況下,該名稱由兩部分組成,名稱空間的名稱和動(dòng)作的名稱,由字符‘.’分隔。例如在名稱空間“tb”中名稱為“StartTransaction”的動(dòng)作稱為“tb.StartTransaction”。將在以下提供名稱空間的更多信息。ILibrary是DLL的表示。它為管理狀態(tài)機(jī)中使用的IAction集提供便利。每個(gè)IAction被動(dòng)態(tài)地載入,并且按照DLL的需要而生成。如上描述,也可以可任選地提供一系列入口點(diǎn),用于用戶化狀態(tài)機(jī)的行為。IConstant接口是可以在狀態(tài)機(jī)中使用的常量的只讀表示。它可以用于對(duì)IVariable的表達(dá)式和賦值。每個(gè)IConstant由其名稱唯一識(shí)別。IConstant名稱可以包括字母數(shù)字字符和‘_’字符。常量的定義將在下面更充分的描述。StateMachine實(shí)現(xiàn)允許按需生成要使用的變量。IVariable接口代表這些變量。不像大多數(shù)其他元素,IVariable不是只讀的,允許改變它的值。每個(gè)IVariable由其名稱唯一識(shí)別。IVariable名稱可以包括字母數(shù)字字符和‘_’字符。將在下面更充分的描述變量的定義。StateMachine實(shí)現(xiàn)支持定時(shí)器的生成,這些定時(shí)器或者周期性地重復(fù)或者僅僅單次終止。任何定時(shí)器每次終止時(shí),它均產(chǎn)生要由狀態(tài)機(jī)處理的超時(shí)消息。ITimer接口代表這些定時(shí)器。每個(gè)ITimer由其名稱唯一識(shí)別。ITimer名稱可以包括字母數(shù)字字符和‘_’字符。值得注意的是,定時(shí)器的定義也隱含著生成對(duì)應(yīng)的超時(shí)消息。將附加在定時(shí)器名稱的包含字符串“_timeout”的名稱分配給這個(gè)消息。將在下面更充分地描述定時(shí)器的定義。StateMachine實(shí)現(xiàn)允許對(duì)關(guān)鍵碼表進(jìn)行詳細(xì)敘述。表中的每個(gè)入口都有一個(gè)相關(guān)的關(guān)鍵碼。每個(gè)關(guān)鍵碼指的是單一值。關(guān)鍵碼和值可能是字符串?dāng)?shù)據(jù),或者是整數(shù)數(shù)據(jù)。每個(gè)ILookupTable由其名稱唯一識(shí)別。ILookupTable名稱可以包括字母數(shù)字字符和‘_’字符。將在下面更充分的描述查找表的定義。StateMachine實(shí)現(xiàn)能以多個(gè)方法使用表達(dá)式。每個(gè)表達(dá)式由從IStatMachine接口的GetExpression工廠方法獲得的IExpression接口的實(shí)例來(lái)表示。值得注意的是,由于XML的解析限制,表達(dá)式以下面的字符表示作為XML實(shí)體。StateMachine實(shí)現(xiàn)允許在XML中使用擴(kuò)展標(biāo)簽。這些標(biāo)簽通過(guò)IPlugin的實(shí)例處理。IPlugin接口提供處理服務(wù)所要求的、但對(duì)狀態(tài)機(jī)本身不使用的標(biāo)簽。每個(gè)IPlugin由其名稱唯一識(shí)別。IPlugin名稱可以包括字母數(shù)字字符和‘_’字符。下面將討論與對(duì)狀態(tài)機(jī)開(kāi)發(fā)的Plugin有關(guān)的更多信息。IProcedure接口代表可以執(zhí)行的動(dòng)作集。每個(gè)IProcedure由其名稱唯一識(shí)別。IProcedure的名稱以數(shù)字字符開(kāi)始,并可以包括字母數(shù)字字符和‘_’字符。將在下面討論更多狀態(tài)機(jī)中的處理有關(guān)的信息。ISynchTable接口是一種機(jī)制,它可以在狀態(tài)轉(zhuǎn)換之前協(xié)調(diào)多個(gè)事件。每個(gè)ISynchTable由其名稱唯一識(shí)別。ISynchTable的名稱以數(shù)字字符開(kāi)始,可能包括字母數(shù)字字符和‘_’字符。將在下面討論更多同步事件有關(guān)的信息。狀態(tài)機(jī)的操作要求兩個(gè)階段來(lái)終止其執(zhí)行。在第一階段,狀態(tài)機(jī)的執(zhí)行線程通過(guò)調(diào)用狀態(tài)機(jī)的Stop(停止)方法來(lái)停止。該方法直到線程完成且成功終止后才能返回。狀態(tài)機(jī)終止的第二個(gè)階段通過(guò)調(diào)用CStateMachineFactory對(duì)象的ReleaseStateMachine靜態(tài)方法來(lái)初始化。這個(gè)靜態(tài)方法接受參數(shù),包括追蹤對(duì)象句柄以及指向要釋放的狀態(tài)機(jī)實(shí)例的指針。用于有效狀態(tài)機(jī)XML的優(yōu)選XML規(guī)范語(yǔ)言文件的結(jié)構(gòu)以<state-machine>標(biāo)簽開(kāi)始,如下所示<state-machinemodal=false>....</state-machine><state-machine>標(biāo)簽有一個(gè)可任選的模型屬性(modalattribute)。該屬性可以用來(lái)改變用于處理未知消息的行為,其將在下面更充分地描述??梢詫⑵渲翟O(shè)為假來(lái)禁止模型屬性。該屬性不在正常情況下使用。XML文件的剩余部分構(gòu)造成段,段的第一部分定義了元素,這些元素在其所遵循的規(guī)則中使用。所有的元素在它們使用在規(guī)則中之前定義。這些元素包括Library(庫(kù)),Timer(定時(shí)器),Constant(常量),Variable(變量),State(狀態(tài)),Message(消息),Action(動(dòng)作),以及LookupTable(查找表)。包括在相關(guān)列表標(biāo)簽中的每個(gè)元素類型如圖3所示。庫(kù)定義包括<library>標(biāo)簽,其后為識(shí)別DLL的名稱的名稱屬性。該名稱可以是完全限定的。如果不是,則使用可執(zhí)行模塊的正常搜索順序來(lái)尋找DLL??扇芜x的<comment>標(biāo)簽可以包含在其中,圖4示出了示例的庫(kù)列表。如圖5所示,定時(shí)器定義包括<timer>標(biāo)簽,其后為識(shí)別定時(shí)器名稱的名稱屬性。該名稱也用于生成用在超時(shí)事件中的消息??扇芜x的<comment>標(biāo)簽可以包含在其中。如圖6所示,常量定義包括<constant>標(biāo)簽,其后為識(shí)別常量名稱的名稱屬性和識(shí)別常量類型的可任選類型屬性。如果沒(méi)有指定類型屬性,常量的類型默認(rèn)為整型。類型屬性可以為下表所指定的值中一個(gè)。所要求的<value>標(biāo)簽之后為給定的常量值。可任選的<comment>標(biāo)簽可以包含在其中。變量定義包括<variable>標(biāo)簽,其后為識(shí)別變量名稱的名稱屬性和識(shí)別變量類型的可任選類型屬性。如果沒(méi)有指定類型屬性,變量的類型默認(rèn)為整型。類型屬性可以為下表所指定的值中的一個(gè)。此外,變量的初始值,最大值和最小值可以如下表所示的定義。圖7中的例子顯示了名稱為my_variable的變量的定義,該變量為整數(shù)類型,初始值為0,最小值為0,最大值為100。如圖8所示,狀態(tài)定義包括<state-definition>標(biāo)簽,其后為識(shí)別狀態(tài)名稱的名稱屬性。也可以包括可任選的<comment>標(biāo)簽。此外,有且只有一個(gè)狀態(tài)必須使用<initial/>標(biāo)簽來(lái)識(shí)別為初始狀態(tài)。也可能指定可任選的<global>標(biāo)簽,將該狀態(tài)識(shí)別成為全局狀態(tài),以在狀態(tài)特有規(guī)則之前對(duì)規(guī)則進(jìn)行檢查。如果狀態(tài)被標(biāo)識(shí)成為全局狀態(tài),則其不可以也被標(biāo)識(shí)成為初始狀態(tài)。如圖9所示,消息定義包括<msg>標(biāo)簽,其后為識(shí)別消息名稱的名稱屬性。該定義可任選地包含下面的標(biāo)簽中任一個(gè)或全部標(biāo)簽如圖10所示,動(dòng)作定義包括<action>標(biāo)簽,其后為識(shí)別動(dòng)作名稱的名稱屬性。也可以包括可任選的<comment>標(biāo)簽。參數(shù)也可以通過(guò)可任選的<parameter>標(biāo)簽指定??梢灾付ǘ鄠€(gè)可任選的<parameter>標(biāo)簽。如果只需要單個(gè)的參數(shù)字符串,那么可以使用動(dòng)作標(biāo)簽的參數(shù)屬性來(lái)指定該參數(shù)。如圖11所示,查找表定義包括<lookup-table>標(biāo)簽,其后為如下屬性在<lookup-table>標(biāo)簽之后可以是0或更多的<lookup-entry>標(biāo)簽。每一個(gè)這樣的標(biāo)簽指定關(guān)鍵碼屬性和值屬性。使用該表的查找包括在表中搜索匹配關(guān)鍵碼,以及返回對(duì)應(yīng)值。特性(property)提供在標(biāo)簽的值和屬性上由一個(gè)字符串取代另一個(gè)字符串的能力。特性定義包括<property>標(biāo)簽,其后為識(shí)別特性名稱的名稱屬性和識(shí)別被取代值的值屬性。為了使用該特性,可使用字符‘%’作為首尾字符。以下為特性定義的例子<propertyname=”SOMENAME”value=”c:\file\path”>。名稱空間提供一種能力,幫助防止在不同對(duì)象定義中的動(dòng)作名稱發(fā)生沖突。只要多個(gè)動(dòng)作駐留在不同的名稱空間,它們就可以具有相同的名稱。例如,叫做StartTransaction的兩個(gè)不同的動(dòng)作可以駐留在TB對(duì)象和RAP對(duì)象中。為了區(qū)分它們,它們各自駐留在單獨(dú)的名稱空間tb和rap中,并被引用為tb.StartTransaction和rap.StartTransaction。對(duì)于下面作為例子的名稱空間,在使用前被定義如下<state-machine>...<namespacename=”tb”/><namespacename=”rap”/>...</state-machine>引用動(dòng)作StartTransaction的規(guī)則可以使用以下語(yǔ)法<rules><statename=“State-1”><messagename=“Message-1”><message-rule-list><ruleaction-name=“tb.StartTransaction”/><ruleaction-name=“rap.StartTransaction”/></message-rule-list></message>...</state>...</rules>規(guī)則的定義以定義狀態(tài)機(jī)的有效狀態(tài)開(kāi)始,如下例所示<rules><statename=“State-1”/>...<statename=“State-n”/></rules>每個(gè)狀態(tài)標(biāo)簽有可以在狀態(tài)標(biāo)簽中被接受的有效消息集<rules><statename=“State-1”><messagename=“Message-1”/>...<messagename=“Message-n”/></state>...</rules>如果在‘*’狀態(tài)沒(méi)有用于信息的處理器,則默認(rèn)將任何不包括在該狀態(tài)內(nèi)的消息予以忽略。<tag>標(biāo)簽也可以包括可任選的timeout屬性,用于在進(jìn)入該狀態(tài)時(shí)啟動(dòng)匿名定時(shí)器。如果定時(shí)器在離開(kāi)該狀態(tài)前超時(shí),則其由定義在這個(gè)狀態(tài)中的<timeout-rule-list>處理器來(lái)處理。對(duì)每個(gè)消息標(biāo)簽可任選地定義一套規(guī)則(規(guī)則集)。如果沒(méi)有定義規(guī)則,則不執(zhí)行動(dòng)作。規(guī)則集有如下格式<rules><statename=“State-1”><messagename=“Message-1”><message-rule-list><ruleaction-name=.../><ruleaction-name=.../>...<ruleaction-name=.../><success-transition>...</success-transition></message-rule-list></message>...</state>...</rules>如果規(guī)則集中的所有動(dòng)作在執(zhí)行時(shí)時(shí)返回“真”,則<success-transition>標(biāo)簽指定狀態(tài)機(jī)所轉(zhuǎn)換到的狀態(tài)的名稱。如果沒(méi)有指定<success-transition>標(biāo)簽,則不發(fā)生轉(zhuǎn)換。規(guī)則標(biāo)簽定義包括<rule>元素。規(guī)則的所有其他部分是可任選的。規(guī)則的可任選部分包括·要執(zhí)行的動(dòng)作·在上面第一個(gè)動(dòng)作返回為假的情況下要執(zhí)行的動(dòng)作·在上面第一個(gè)動(dòng)作處于異常時(shí)所要執(zhí)行的動(dòng)作。如果沒(méi)有指定上面的任何可任選的動(dòng)作,則規(guī)則執(zhí)行CNullAction,其在調(diào)用Execute()方法時(shí)不進(jìn)行任何操作。規(guī)則定義如下<rules><state><state-name>State-1</state-name><message><message-name>Message-1</message-name><message-rule-list><ruleaction-name=”...”/><on-failure-action>...</on-failure-action><on-exception-action>...</on-exception-action></rule><success-transition>...</success-transition></message-rule-list></message>...</state>...</rules>動(dòng)作標(biāo)簽定義指定要使用的動(dòng)作的名稱,并且可以指定由該動(dòng)作使用的零或更多的<parameter>標(biāo)簽。如果動(dòng)作僅僅需要單個(gè)參數(shù),則可以使用<action>或<rule>標(biāo)簽的參數(shù)屬性來(lái)指定。動(dòng)作標(biāo)簽格式具有如下形式<rules><state><state-name>State-1</state-name><message><message-name>Message-1</message-name><message-rule-list><ruleaction-name=“SomeAction”><parametervalue=“SomeAction”/>...<parametervalue=“SomeAction”/>...</rule><success-transition>...</success-transition></message-rule-list></message>...</state>...</rules>狀態(tài)也可以具有入口和/或出口標(biāo)簽規(guī)則集,其可以在進(jìn)入狀態(tài)或這從狀態(tài)退出時(shí)執(zhí)行。規(guī)則集的唯一限制是它可能不能從進(jìn)入/退出的狀態(tài)轉(zhuǎn)換出來(lái)。該入口列表標(biāo)簽可以具有如下形式<rules><state><state-name>State-1</state-name>...<entry-rule-list><ruleaction-name=“SomeAction”><parametervalue=“SomeAction”/>...<parametervalue=“SomeAction”/></rule></entry-rule-list><exit-rule-list>...<exit-rule-list></state>...</rules>任何狀態(tài)機(jī)規(guī)范文件可以嵌入其他狀態(tài)機(jī)規(guī)范文件。例如,狀態(tài)機(jī)XML可以嵌入其他XML文件,以合起來(lái)處理。StateMachine提供<include>標(biāo)簽來(lái)包括嵌入的文件,它的URL由名稱屬性指定。文件可以嵌入在狀態(tài)機(jī)規(guī)范文件中來(lái)提供動(dòng)作、狀態(tài)、消息的共有集合(commonset),以及提供一組優(yōu)先于基本文件中元素的用戶專用集元素。例如,下面的原始文件包含需要四個(gè)要處理的嵌入文件<state-machine><includename=”other-document-url.xml”><includename=”other-document2-url.xml”><includename=”other-document3-url.xml”><includename=”other-document4-url.xml”>...</state-machine>嵌入的文件必須具有頂層(toplevel)<state-machine>標(biāo)簽。例如,包括在上個(gè)例子中的other-document-url.xml必須是合法的狀態(tài)機(jī)XML文件,而且必須以狀態(tài)機(jī)標(biāo)簽開(kāi)始。狀態(tài)機(jī)提供了新過(guò)程(procedure)能力,允許消息處理器(messagehandler)執(zhí)行一組共有規(guī)則。過(guò)程是可以從任何消息處理器調(diào)用的規(guī)則的集合。一旦這個(gè)規(guī)則的集合的執(zhí)行結(jié)束,執(zhí)行返回到原始消息處理器。使用<procedure>標(biāo)簽來(lái)定義過(guò)程標(biāo)簽,如下例所示<procedurename=”Null”><procedure-rule-list><ruleaction-name=...>...<procedure-rule-list></procedure>過(guò)程可具有使用<argument>標(biāo)簽定義的零或更多的自變量標(biāo)簽,其具有所需要的名稱屬性。在使用名稱屬性上的名稱的過(guò)程中的任何地方,可以將自變量參考為變量。當(dāng)從過(guò)程返回時(shí),自變量的值是未定義的。自變量可被定義如下<procedurename=”Null”><argumentname=”arg1”type=”string”default-value=””><procedure-rule-list><ruleaction-name=...>...<procedure-rule-list></procedure>使用<return>標(biāo)簽使執(zhí)行返回至調(diào)用程序。返回標(biāo)簽的例子為<procedurename=”Null”><ruleaction-name=...>...<return></procedure>當(dāng)過(guò)程返回時(shí),執(zhí)行以在<call>規(guī)則之后的下一個(gè)規(guī)則重新開(kāi)始。如下例中使用<tag>標(biāo)簽執(zhí)行過(guò)程<callname=”Null”/>名稱屬性是必要的,并且其指定原來(lái)定義的過(guò)程名稱。<call>規(guī)則可以放置在可以放置<rule>標(biāo)簽的任何地方。過(guò)程的<call>標(biāo)簽也可以指定參數(shù)標(biāo)簽值。在下面的例子中,這些值由<parameter>標(biāo)簽表示<callname=”Null”><parametertype=”string”value=”HelloWorld!”><callname=”Null”>如果省略了參數(shù),則取由對(duì)應(yīng)的<argument>標(biāo)簽指定的任何默認(rèn)值。參數(shù)是有定位的,例如,第一個(gè)參數(shù)和指定的第一個(gè)自變量相匹配,第二個(gè)參數(shù)和指定的第二個(gè)自變量相匹配。有時(shí),在一個(gè)狀態(tài)轉(zhuǎn)換成另一個(gè)狀態(tài)之前,需要等待多個(gè)事件發(fā)生。當(dāng)接收特定的事件時(shí),持續(xù)追蹤所有的事件或者需要等待每個(gè)事件的多個(gè)狀態(tài),或者需要一系列標(biāo)志集(flagset)。習(xí)慣用語(yǔ)普遍說(shuō)成為狀態(tài)機(jī)提供了特別的構(gòu)造來(lái)持續(xù)追蹤多個(gè)事件。對(duì)象ISynchTable提供了所期望的事件的列表。當(dāng)接收到事件時(shí),ISynchTable持續(xù)追蹤所接收到的事件。一系列內(nèi)部動(dòng)作提供了管理和監(jiān)控ISynchTable狀態(tài)的能力,它們是使用標(biāo)簽<synch-table>定義SynchTable如下例所示<synch-tablename=“Stable1”><entry>Message1</entry><entry>Message2</entry>...<entry>Messagen</entry></synch-table>某些標(biāo)簽在確定要執(zhí)行的動(dòng)作時(shí)使用表達(dá)式。這些標(biāo)簽提供條件邏輯并包括<if>,<else-if>,<select>,以及<while>。表達(dá)式由左邊,即可任選的操作符,以及可任選的右邊組成。左邊和右邊可以是變量,常量,或者值。所支持的操作符為如果表達(dá)式僅僅由左邊組成,當(dāng)表達(dá)式的值不是零或空的時(shí)候,表達(dá)式的值為“真”。否則,表達(dá)式的值為“假”。此外,實(shí)現(xiàn)接口IEvaluateable的任何動(dòng)作可以用作表達(dá)式。調(diào)用動(dòng)作的執(zhí)行方法,并返回用作表達(dá)式結(jié)果的布爾值。操作符!可以應(yīng)用于任何表達(dá)式。這個(gè)操作符將隨后的表達(dá)式求值的結(jié)果取反。表達(dá)式是使用表達(dá)式標(biāo)簽以及在標(biāo)簽之間提供的規(guī)范語(yǔ)言語(yǔ)句來(lái)定義的。示例的一組表達(dá)式可能包括現(xiàn)在所述的邏輯結(jié)構(gòu)。<if>標(biāo)簽求取給定表達(dá)式的值,如果為“真”,則執(zhí)行包含在其中的規(guī)則集。在圖12中示出了if表達(dá)式的例子。<else>標(biāo)簽可以可任選地出現(xiàn)在<if>標(biāo)簽之后。如果表達(dá)式的值為“假”,則執(zhí)行<else>標(biāo)簽內(nèi)的規(guī)則集。圖13中示出了else的定義。同樣,<else-if>標(biāo)簽可以可任選地出現(xiàn)在<if>標(biāo)簽之后。該標(biāo)簽包含表達(dá)式屬性。如果表達(dá)式的值為“真”,則執(zhí)行<else-if>標(biāo)簽中的規(guī)則集。圖14中示出了else-if的定義?;谝幌盗斜磉_(dá)式的求取值,<select>標(biāo)簽允許一系列規(guī)則集之中的一個(gè)規(guī)則集的執(zhí)行。圖15示出了select的定義?;谠?lt;when>標(biāo)簽中提供的一系列表達(dá)式的求取值,<select>標(biāo)簽允許一系列規(guī)則集之中的一個(gè)規(guī)則集的運(yùn)行。圖16示出了when的定義。使用<otherwise>標(biāo)簽可以指定默認(rèn)選擇。如果所有以前的表達(dá)式都失效,則執(zhí)行<otherwise>標(biāo)簽中的規(guī)則集。圖17示出了otherwise的定義。<for>標(biāo)簽允許一組動(dòng)作的重復(fù)執(zhí)行。圖18示出了for的定義。在“for”表達(dá)式中的variable屬性指定了用于控制循環(huán)的控制變量。僅僅整型變量可以用于此目的。Initial-value屬性指定啟動(dòng)控制變量的初始值。Limit屬性指定控制變量的最大值。當(dāng)控制變量的值超過(guò)了該值時(shí),循環(huán)終止。Increment屬性指定對(duì)于循環(huán)的每個(gè)重復(fù)控制變量的增量。<while>標(biāo)簽允許一組動(dòng)作的重復(fù)執(zhí)行。圖19示出了while的定義。只要expression屬性保持為“真”,就再一次執(zhí)行動(dòng)作。<timeout-rule-list>標(biāo)簽提供了方便快捷的機(jī)制,該機(jī)制用于對(duì)來(lái)自定時(shí)器的超時(shí)消息定義處理器??扇芜x的timer-name屬性允許通過(guò)名稱來(lái)識(shí)別定時(shí)器。如果沒(méi)有指定這個(gè)屬性,被處理的定時(shí)器必須根據(jù)狀態(tài)而與一個(gè)集合相對(duì)應(yīng)。超時(shí)規(guī)則列表和<message>定義駐留在同一層次。圖20示出了超時(shí)規(guī)則列表的例子。<break>標(biāo)簽提供一種機(jī)制,該機(jī)制使消息處理器對(duì)當(dāng)前的消息停止執(zhí)行規(guī)則。其在任何駐留<rule>標(biāo)簽的地方均有效。圖21示出了break標(biāo)簽用法的例子。<yield>標(biāo)簽提供一種機(jī)制,該機(jī)制使消息處理器對(duì)當(dāng)前的消息停止執(zhí)行規(guī)則。此外,如果當(dāng)前的狀態(tài)機(jī)是狀態(tài)機(jī)協(xié)同群集的一員,將在下面更充分的描述的,那么其可以將焦點(diǎn)(focus)轉(zhuǎn)移到該組中的其他狀態(tài)機(jī)。如果當(dāng)前的狀態(tài)機(jī)不是狀態(tài)機(jī)協(xié)同群集中的一員,那么它和<break>標(biāo)簽一樣操作。其在<rule>標(biāo)簽可以駐留的任何地方有效。圖22示出了yield標(biāo)簽用法的例子。由<assert>規(guī)則標(biāo)簽識(shí)別的斷言支持(assertionsupport),指定了在XML規(guī)則之中的某些特定點(diǎn)期望保持“真”的條件。如果該條件不能保持為“真”,則該斷言失效。在斷言失效的事件中執(zhí)行的動(dòng)作取決于狀態(tài)機(jī)如何編譯。如果狀態(tài)機(jī)以Release模式編譯,則在斷言產(chǎn)生處于異常狀態(tài)時(shí),該異常將被作為規(guī)則集的故障來(lái)處理,執(zhí)行故障處理器(failurehandler)。如果狀態(tài)機(jī)以Debug模式編譯,中斷狀態(tài)機(jī)的運(yùn)行,出現(xiàn)如圖23所示的斷言對(duì)話框。通過(guò)按斷言對(duì)話框中的按鈕,進(jìn)行如下動(dòng)作數(shù)據(jù)模型資源管理器可以提供有狀態(tài)機(jī)實(shí)現(xiàn),來(lái)提供用于顯示由狀態(tài)機(jī)所保留的數(shù)據(jù)對(duì)象的機(jī)制。存儲(chǔ)在狀態(tài)機(jī)內(nèi)的每個(gè)對(duì)象都具有元數(shù)據(jù)的相關(guān)集。這個(gè)元數(shù)據(jù)包括目前,數(shù)據(jù)模型資源管理器可以僅僅和Java支持聯(lián)合使用。將在下面更充分地描述Java支持。圖24示出了數(shù)據(jù)模型資源管理器窗口的例子。環(huán)境變量文本可以被替換成為XML語(yǔ)句內(nèi)的值和屬性。舉個(gè)例子,假設(shè)生成了下面的環(huán)境變量SCOT_BASE=c:\scot這個(gè)變量可以由兩個(gè)‘%’符號(hào)之間的變量名替代,如下例所示<tagattribute=”%SCOT_BASE%\filename.txt”>所得的文本等效于<tagattribute=”c:\scot\filename.txt”>屬性值可以被替代成為規(guī)范語(yǔ)言語(yǔ)句中的值和屬性。它們可以被看作為環(huán)境變量。如果屬性和環(huán)境變量共享相同的名稱,則屬性值優(yōu)先于由環(huán)境變量設(shè)定的值。例如,假設(shè)下面的屬性已在XML語(yǔ)言語(yǔ)句中以如下的<property-list>語(yǔ)句定義<propertyname=”SCOT_BASE”value=”c:\scot”>這個(gè)值可以由兩個(gè)‘%’符號(hào)之間的屬性名替代,如下例所示<tagattribute=”%SCOT_BASE%\filename.txt”>所得的文本等效于<tagattribute=”c:\scot\filename.txt”>基本狀態(tài)機(jī)實(shí)現(xiàn)提供了許多動(dòng)作。下面示出了內(nèi)建動(dòng)作的列表的例子Assign-variable內(nèi)建動(dòng)作用于給指定的變量賦值。它接受如下參數(shù)Clean-state內(nèi)建動(dòng)作,用于從狀態(tài)機(jī)堆棧移除所有狀態(tài),它沒(méi)有參數(shù)。decrement-variable內(nèi)建動(dòng)作用于自減指定的變量的值。它有如下參數(shù)goto-state內(nèi)建動(dòng)作,用于強(qiáng)制狀態(tài)機(jī)轉(zhuǎn)換成為給定的狀態(tài)。它具有如下參數(shù)increment-variable內(nèi)建動(dòng)作用于自增指定的變量的值。它具有如下參數(shù)如果接收到了ISynchTable實(shí)例中的所有事件,is_all_complete內(nèi)建動(dòng)作返回“真”。它具有如下參數(shù)如果接收到了ISynchTable實(shí)例中的任一事件,is_any_complete內(nèi)建動(dòng)作返回“真”。它具有如下參數(shù)如果ISynchTable實(shí)例已接收到的參數(shù)列表中指定的所有事件,is_complete內(nèi)建動(dòng)作返回“真”。它具有如下參數(shù)is_timer_timing內(nèi)建動(dòng)作,用于表達(dá)式中來(lái)確定特殊的定時(shí)器是否正在定時(shí)。它具有如下參數(shù)log內(nèi)建動(dòng)作,用于在調(diào)試日志中加入輸出行。它具有如下參數(shù)log-event內(nèi)建動(dòng)作,用于在應(yīng)用事件日志中加入輸出行。它具有如下參數(shù)match內(nèi)建動(dòng)作,用于對(duì)給定的常規(guī)表達(dá)式測(cè)試字符串。它具有如下參數(shù)pop-state內(nèi)建動(dòng)作,用于將狀態(tài)機(jī)轉(zhuǎn)換至原來(lái)存在堆棧中的狀態(tài),如果堆棧為空,動(dòng)作記錄一個(gè)錯(cuò)誤,并且終止執(zhí)行鏈。這個(gè)動(dòng)作沒(méi)有參數(shù)。push-state內(nèi)建動(dòng)作,用于將當(dāng)前的狀態(tài)或者給定的狀態(tài)保存到堆棧中。它具有如下參數(shù)狀態(tài)機(jī)使用resend-msg內(nèi)建動(dòng)作來(lái)重新發(fā)送當(dāng)前消息給它自己。這個(gè)動(dòng)作沒(méi)有參數(shù)。reset內(nèi)建動(dòng)作用于將ISynchTable實(shí)例重新設(shè)置為一個(gè)已知狀態(tài)。它具有如下參數(shù)狀態(tài)機(jī)使用send-msg內(nèi)建動(dòng)作來(lái)發(fā)送消息給它自己。它具有如下參數(shù)Start-timer內(nèi)建動(dòng)作用于啟動(dòng)定時(shí)器。它具有如下參數(shù)stop-timer內(nèi)建動(dòng)作用于停止定時(shí)器。如果給定的定時(shí)器當(dāng)前沒(méi)有在使用,則動(dòng)作失效。它具有如下參數(shù)update內(nèi)建動(dòng)作,用于更新ISynchTable實(shí)例中的入口。默認(rèn)的,它使用當(dāng)前的消息作為事件。可以可任選地指定事件。它具有如下參數(shù)wait-timer內(nèi)建動(dòng)作用于等待定時(shí)器超時(shí)。如果給定的定時(shí)器當(dāng)前沒(méi)有在使用,則動(dòng)作失效。它具有如下參數(shù)注意該動(dòng)作在主狀態(tài)機(jī)線程上執(zhí)行硬等待。因?yàn)樵搫?dòng)作不允許處理任何其他消息直到等待結(jié)束,它應(yīng)該被謹(jǐn)慎地使用。yield內(nèi)建動(dòng)作,用于放棄對(duì)群集中的一些其他狀態(tài)機(jī)的控制。如果這個(gè)群集中沒(méi)有定義其他的狀態(tài)機(jī),那么動(dòng)作僅用于停止當(dāng)前的執(zhí)行鏈。這個(gè)動(dòng)作沒(méi)有參數(shù)。在狀態(tài)機(jī)內(nèi)定義兩種不同的類。第一種是沒(méi)有參數(shù)且所有的方法定義為純虛擬的抽象基類。用于這些類的類名稱的第一個(gè)字母是‘I’,例如IClassName。第二種類或者是具體的實(shí)現(xiàn),或者是具有屬性和/或定義的方法的抽象基類。這些類的類名稱的第一個(gè)字母是‘C’,例如CClassName。下表提供了典型的類名稱和每個(gè)類的簡(jiǎn)要描述的列表圖25示出了非瞬態(tài)狀態(tài)機(jī)類的類圖。每個(gè)類包含和類相關(guān)的方法。在圖中通過(guò)三角與其他類相連接的類表示更高的類的繼承。在圖中通過(guò)菱形和其他類相連接的類表示相關(guān)類。下面的表格包含用于標(biāo)簽映射的XPath表達(dá)式的羅列。SMLoader使用這些表達(dá)式來(lái)確定哪一個(gè)CContentHandler類處理當(dāng)前的XML標(biāo)簽。在圖26的類表中的多數(shù)類只用于解析XML文件的目的,它們?cè)诮馕鐾瓿芍蟊会尫?。那些不是瞬態(tài)的類由StateMachine使用。狀態(tài)機(jī)的最新版本提供了Java應(yīng)用的支持。該狀態(tài)機(jī)由類com.ncr.statem.StateMachine的實(shí)例表示。這個(gè)Java類和底層的C++CJavaStateMachine對(duì)象相互作用,該對(duì)象允許Java動(dòng)作結(jié)合C++動(dòng)作執(zhí)行。狀態(tài)機(jī)Java支持被提供來(lái)作為單獨(dú)分開(kāi)的、調(diào)用statemj.dll的可執(zhí)行DLL。這個(gè)DLL為Java提供所有的支持類,以及支持Java動(dòng)作的Java原生接口(JavaNativeInterface,JNI)代碼。Java支持已被實(shí)現(xiàn)為到狀態(tài)機(jī)的plugin。結(jié)果,以下面的語(yǔ)句在XML定義中加入了Javaplugin<plugin-list><pluginname=”Java.Factory”/></plugin-list>類com.ncr.statem.StateMachin的所有實(shí)例經(jīng)由com.ncr.statem.StateMachineFactory類來(lái)生成。Create方法返回充分載入的狀態(tài)機(jī)實(shí)例。其有如下簽名PublicstaticStateMachinecreate(String_name,String_url,String_dllName,String_configDir);在這個(gè)調(diào)用語(yǔ)句中,_name參數(shù)指定狀態(tài)機(jī)的唯一名稱。_url參數(shù)指定包含狀態(tài)機(jī)的XML定義的URL。_dllName參數(shù)指定包含Java支持的共享DLL的名稱。_configDir參數(shù)指定用于URL相關(guān)搜索的目錄。Java中可以定義動(dòng)作,該動(dòng)作可以和C++中定義的動(dòng)作并存。實(shí)際上,所有的內(nèi)部動(dòng)作都是C++動(dòng)作。不像C++動(dòng)作,Java動(dòng)作在使用之前沒(méi)有登記。替代的,它們通過(guò)使用Java映像設(shè)施(reflectionfacility)來(lái)生成。已命名的類的實(shí)例在第一次遇到它時(shí)按照需要而生成,并且在狀態(tài)機(jī)的整個(gè)使用期限內(nèi)保持。當(dāng)狀態(tài)機(jī)結(jié)束,Java動(dòng)作被銷毀。下面顯示了Java動(dòng)作定義的例子。附加的<class>標(biāo)簽識(shí)別該動(dòng)作為Java動(dòng)作。在<class>標(biāo)簽上的名稱屬性指定完全限定的動(dòng)作的類名稱。<action-list><actionname=”SomeAction”><classname=”com.ncr.ActionName”></action></action-list>存儲(chǔ)在如下描述的共享數(shù)據(jù)模型內(nèi)的Jave對(duì)象的任何字段,可以在由狀態(tài)機(jī)使用的表達(dá)式中被訪問(wèn)。通過(guò)調(diào)用字段的存取器方法(accessormehtod)可以訪問(wèn)這些字段。只可以調(diào)用getXXX()形式的存取器方法,其中XXX是要訪問(wèn)的字段的名稱。對(duì)象本身可通過(guò)它的XPath名稱從共享數(shù)據(jù)模型被引用。在表達(dá)式中使用的語(yǔ)法是$(xpath-expression)[.method-name()][[index]]其中,Xpath-expression是期望的Java對(duì)象的XPath表達(dá)式。僅僅那些以字符‘/,開(kāi)頭的簡(jiǎn)單絕對(duì)(simpleabsolute)XPath表達(dá)式可以被支持。Method-name是存取器方法名稱。該方法名稱是可任選的。如果沒(méi)有指定方法名稱,則使用對(duì)象本身作為值。Index指定數(shù)組的索引。這個(gè)參數(shù)要求從數(shù)據(jù)模型返回的對(duì)象或者是數(shù)組,或者是Java集合(Javacollection),該數(shù)組或Java集合通過(guò)索引(例如ArrayList)指定訪問(wèn)其成員的能力。僅僅那些由Java支持的原生類型可以被直接操作。這些原生類型包括整型,長(zhǎng)整型和布爾類型。Java.lang.String類是特殊的,其也可以被直接訪問(wèn)。用戶定義的所有其它Java對(duì)象均通過(guò)調(diào)用對(duì)象的toString()方法來(lái)間接操作。在下面的例子中,表達(dá)式“$(/transaction/current-instance).getTotalDue()>;0”首先使用xpath表達(dá)式“/transaction/current-instance”從共享的數(shù)據(jù)模型執(zhí)行對(duì)象的查找。然后,該表達(dá)式定位和調(diào)用對(duì)象的getTotalDue方法。最后,該表達(dá)式將從該方法返回的長(zhǎng)整型值和零做比較。如果該值大于零,返回值為“真”。如果該值小于或等于零,返回值為“假”。圖26示出了用于支持Java的類的類圖。同樣,圖中指出了每個(gè)類中可用的方法。下表識(shí)別了JAVA支持的類并且在表后給出了每個(gè)類的簡(jiǎn)要描述com.ncr.statem.StateMachine類是主要的狀態(tài)機(jī)類。該類為訪問(wèn)狀態(tài)機(jī)的功能性提供多個(gè)機(jī)制,其提供如下機(jī)制●對(duì)下層的數(shù)據(jù)結(jié)構(gòu)(例如查找表和動(dòng)作)的訪問(wèn)●向狀態(tài)機(jī)發(fā)送/發(fā)布消息的能力●對(duì)DataModel對(duì)象的訪問(wèn),該DataModel對(duì)象用于為動(dòng)作的使用提供對(duì)象的鍵控存儲(chǔ)(keyedstorage)。對(duì)于com.ncr.statem.StateMachine的每個(gè)實(shí)例,均存在底層C++CJavaStateMachine對(duì)象。com.ncr.statem.StateMachineCluster類表示協(xié)作的com.ncr.statem.StateMachine實(shí)例的集合。它本身是com.ncr.statem.StateMachine的實(shí)例,并且可以用在任何可有效使用com.ncr.statem.StateMachine的地方。它提供和上面提到的com.ncr.statem.StateMachine相同的能力,并且將消息發(fā)送至當(dāng)前有效的狀態(tài)機(jī)實(shí)例。對(duì)于com.ncr.statem.StateMachineCluster的每個(gè)實(shí)例,均存在底層C++CJavaCluster對(duì)象。com.ncr.statem.Action類是所有Java動(dòng)作必須實(shí)現(xiàn)的接口。提供了兩種方法-execute和getResult。前者對(duì)應(yīng)于C++IAction接口的執(zhí)行方法。后者提供了獲得“真”或“假”的返回值的能力。在C++領(lǐng)域中,這一能力通過(guò)設(shè)定pResult參數(shù)來(lái)實(shí)現(xiàn)。在Java中參數(shù)由值傳遞,所以不使用該方法。對(duì)于生成的每個(gè)com.ncr.statem.Action類,均存在底層CJavaActionC++對(duì)象。com.ncr.statem.Message類用作對(duì)狀態(tài)機(jī)的輸入。這個(gè)類等效于C++實(shí)現(xiàn)中的IMessge。對(duì)于這個(gè)類中的每個(gè)實(shí)例,均存在C++側(cè)(C++side)上的底層CJavaMessage。com.ncr.statem.LookupTable類等效于C++實(shí)現(xiàn)中的ILookupTable。com.ncr.statem.LookupTable和ILookupTable實(shí)例之間一一對(duì)應(yīng)。對(duì)于com.ncr.statem.LookupTable的每個(gè)實(shí)例,均存在底層ILookupTable對(duì)象。下表識(shí)別了C++Java的原生類,這些類簡(jiǎn)要描述如下CJavaStateMachine類源自CXMLStateMachine,并且提供被要求來(lái)允許從狀態(tài)機(jī)執(zhí)行Java動(dòng)作的功能性。CJavaAction類為保存類路徑和其他消息提供備份存儲(chǔ),該類路徑和其他消息與調(diào)用對(duì)應(yīng)的com.ncr.statem.Action的執(zhí)行方法有關(guān)。CJavaMessage類為保存JNI信息提供備份存儲(chǔ),該JNI信息與使用在狀態(tài)機(jī)中對(duì)應(yīng)的com.ncr.statem.Message有關(guān)。CJavaActionProxy類在載入處理過(guò)程中保存類信息。這一信息稍后用于生成CJavaAction及其對(duì)應(yīng)的com.ncr.statem.Action。CJavaPluginFactory類提供將Java支持鉤入狀態(tài)機(jī)所必要的IPlugin接口。上面描述的代碼用于實(shí)現(xiàn)Java原生方法。但是,因?yàn)镴AVA原生接口由C編程語(yǔ)言實(shí)現(xiàn),所以沒(méi)有實(shí)際的類(realclass)。下表列出了類及其功能狀態(tài)機(jī)也支持一種配置,在該配置中,多個(gè)狀態(tài)機(jī)以協(xié)作的模式操作。在這個(gè)配置中,一個(gè)狀態(tài)機(jī)被指定為基本狀態(tài)機(jī),且被授予“焦點(diǎn)”。所有的消息首先導(dǎo)向到帶有焦點(diǎn)的狀態(tài)機(jī)。如果該狀態(tài)機(jī)不處理消息,則詢問(wèn)其他狀態(tài)機(jī)看是否有一個(gè)可以處理該消息。如果另一個(gè)狀態(tài)機(jī)可以處理該消息,則該狀態(tài)機(jī)獲得焦點(diǎn),變成當(dāng)前執(zhí)行的狀態(tài)機(jī)。每個(gè)狀態(tài)機(jī)具有在XML定義文件中定義的休眠狀態(tài)。當(dāng)進(jìn)入這一狀態(tài)時(shí),狀態(tài)機(jī)失去焦點(diǎn),除非該狀態(tài)機(jī)是基本狀態(tài)機(jī)。通過(guò)將狀態(tài)機(jī)放在堆棧上來(lái)對(duì)它們進(jìn)行追蹤。堆棧的頂端是當(dāng)前執(zhí)行的狀態(tài)機(jī),并具有焦點(diǎn)。在新的狀態(tài)機(jī)獲得焦點(diǎn)時(shí),將其加入堆棧。當(dāng)狀態(tài)機(jī)失去焦點(diǎn)時(shí),它被從堆棧的頂端移除,返回到可用池(availablepool)。堆棧的新的頂端重新獲得焦點(diǎn)并且在其離開(kāi)的地方重新開(kāi)始執(zhí)行。當(dāng)前執(zhí)行的狀態(tài)機(jī)可能以兩種方式失去焦點(diǎn)。通過(guò)執(zhí)行yield動(dòng)作,狀態(tài)機(jī)自愿地放棄焦點(diǎn)給另外一個(gè)狀態(tài)機(jī)。失去焦點(diǎn)的另一個(gè)方法是接收狀態(tài)機(jī)不能處理的消息。這種無(wú)效性致使具有焦點(diǎn)的狀態(tài)機(jī)產(chǎn)生焦點(diǎn)給能夠處理該消息的另一個(gè)狀態(tài)機(jī)。協(xié)作狀態(tài)機(jī)組通過(guò)CCluseter類的實(shí)例來(lái)管理。這個(gè)類負(fù)責(zé)維護(hù)堆棧以及向組分狀態(tài)機(jī)委派任務(wù)。定義群集的XML語(yǔ)句有頂層的<state-machine-cluster>標(biāo)簽,其后為一個(gè)或多個(gè)用于識(shí)別組分狀態(tài)機(jī)的<state-machine>標(biāo)簽。這些標(biāo)簽上允許如下屬性●兩個(gè)標(biāo)簽的name屬性是用來(lái)引用組分的唯一名稱?!駏rl屬性識(shí)別文件的URL,該文件包含要用于狀態(tài)機(jī)的XML定義?!駆ibrary屬性識(shí)別包含相關(guān)狀態(tài)機(jī)元素的庫(kù)的名稱。這個(gè)庫(kù)必須在狀態(tài)機(jī)能被載入之前載入。在XML語(yǔ)句中的群集定義可能看起來(lái)如下<?xmlversion=”1.0”?><state-machine-clustername=”Fastlane”><state-machine-name=”CustomerMode”url=”FastLaneCustomerMode.xml”library=”statemj”default=”true”/><state-machine-name=”StoreMode”url=”FastLaneStoreMode.xml”library=”statemj”/><state-machine-name=”AssistMode”url=”FastLaneAssitMode.xml”library=”statemj”/><state-machine-name=”MaintenanceMode”url=”FastLaneMaintenanceMode.xml”library=”statemj”/><state-machine-name=”ErrorMode”url=”FastLaneErrorMode.xml”library=”statemj”/></state-machine-cluster>模式狀態(tài)機(jī)是一種狀態(tài)機(jī),在該狀態(tài)機(jī)中,用于處理未知消息的默認(rèn)行為已被改變。模式狀態(tài)機(jī)寧愿將消息排隊(duì)直到遇到明確的<yield>標(biāo)簽,也不將控制和消息傳送給群集中的另一個(gè)成員。此時(shí),模式狀態(tài)機(jī)對(duì)另一個(gè)狀態(tài)機(jī)產(chǎn)生控制,并重新發(fā)送排好隊(duì)的所有消息。模型狀態(tài)機(jī)通過(guò)在<state-machine>標(biāo)簽中加入modal=屬性來(lái)定義<state-machinemodal=”true”>...</state-machine>為了準(zhǔn)備操作,以規(guī)范語(yǔ)言(例如為XML)設(shè)計(jì)并編寫(xiě)狀態(tài)機(jī)實(shí)現(xiàn)。在定義中的規(guī)范語(yǔ)言語(yǔ)句包括調(diào)用可執(zhí)行計(jì)算機(jī)代碼的動(dòng)作,該計(jì)算機(jī)代碼可在例如結(jié)賬柜臺(tái)的商務(wù)平臺(tái)上實(shí)現(xiàn)系統(tǒng)功能。包含規(guī)范語(yǔ)言語(yǔ)句的規(guī)范文件存儲(chǔ)在商務(wù)平臺(tái)的硬盤或者類似設(shè)備中。解析應(yīng)用程序也存儲(chǔ)在該硬盤中或存儲(chǔ)在由控制商務(wù)系統(tǒng)的處理器運(yùn)行的商務(wù)平臺(tái)的存儲(chǔ)器中。初始化狀態(tài)機(jī)以及向狀態(tài)機(jī)提供工作線程來(lái)開(kāi)始操作。解析器開(kāi)始解釋狀態(tài)機(jī)定義的規(guī)范語(yǔ)言語(yǔ)句。這個(gè)解釋包括調(diào)用商務(wù)平臺(tái)的商務(wù)邏輯模塊,以及對(duì)返回值求值來(lái)繼續(xù)解析規(guī)范語(yǔ)言語(yǔ)句。狀態(tài)機(jī)實(shí)現(xiàn)定義的解析持續(xù)進(jìn)行直到狀態(tài)機(jī)到達(dá)終止點(diǎn)。此后,狀態(tài)機(jī)實(shí)現(xiàn)要求在再次開(kāi)始實(shí)現(xiàn)的解析之前重新初始化。為了修改商務(wù)系統(tǒng)的操作,除非已經(jīng)修改了商務(wù)平臺(tái),所要求的唯一改變就是為商務(wù)邏輯所要求的那些改變。因?yàn)樯虅?wù)邏輯以規(guī)范語(yǔ)言編寫(xiě),規(guī)范文件內(nèi)部的結(jié)構(gòu)可以改變,而不要求在系統(tǒng)中對(duì)計(jì)算機(jī)代碼進(jìn)行重新編譯和另外的安裝。替代的,可將新版本的規(guī)范語(yǔ)言文件寫(xiě)入硬盤。在初始化時(shí)驗(yàn)證這個(gè)新的版本,然后開(kāi)始新的規(guī)范文件的解析以控制商務(wù)系統(tǒng)。盡管通過(guò)對(duì)示例的處理和系統(tǒng)部件的說(shuō)明來(lái)對(duì)本發(fā)明進(jìn)行了描述,并且,盡管以值得考慮的細(xì)節(jié)描述了各種處理和部件,但申請(qǐng)人并非試圖將所附權(quán)利要求的范圍限制于這些細(xì)節(jié)。對(duì)于本領(lǐng)域普通技術(shù)人員而言,其他的優(yōu)點(diǎn)和修改也容易顯現(xiàn)。因此,在本發(fā)明的最主要的方面是,本發(fā)明的范圍不限于那些給出并進(jìn)行了描述的特定細(xì)節(jié),實(shí)現(xiàn)或示意性的例子。相應(yīng)地,在不偏離申請(qǐng)人的總體的發(fā)明理念的情況下,可以對(duì)這些細(xì)節(jié)作出變更。權(quán)利要求1.一種系統(tǒng),用于控制具有處理器、存儲(chǔ)器和硬盤的商務(wù)系統(tǒng)的操作,其特征在于,包括規(guī)范語(yǔ)言文件,其存儲(chǔ)在硬盤上,該文件包含定義商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn)的規(guī)范語(yǔ)言語(yǔ)句;解析器,用于從規(guī)范語(yǔ)言文件中提取規(guī)范語(yǔ)言語(yǔ)句并解釋所提取的規(guī)范語(yǔ)言語(yǔ)句;商務(wù)邏輯應(yīng)用程序,其包括商務(wù)邏輯模塊,該商務(wù)邏輯模塊包含可執(zhí)行的編譯程序語(yǔ)句;以及解析器調(diào)用至少一個(gè)商務(wù)邏輯模塊來(lái)處理解析器從規(guī)范語(yǔ)言文件中提取的消息。2.如權(quán)利要求1所述的系統(tǒng),其特征在于,解析器包括表達(dá)式解釋器,用于在規(guī)范語(yǔ)言語(yǔ)句中定位表達(dá)式標(biāo)簽,并依照定位的表達(dá)式標(biāo)簽解釋在對(duì)應(yīng)的標(biāo)簽之間的規(guī)范語(yǔ)言語(yǔ)句;方法調(diào)用器,用于調(diào)用商務(wù)邏輯模塊,該調(diào)用器使用解析器從規(guī)范語(yǔ)言文件中提取的消息來(lái)支持商務(wù)邏輯模塊調(diào)用。3.如權(quán)利要求1所述的系統(tǒng),其特征在于,進(jìn)一步包括多個(gè)規(guī)范文件,每個(gè)規(guī)范文件包含定義商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn)的規(guī)范語(yǔ)言語(yǔ)句;以及解析器,用于保留焦點(diǎn)變量,該焦點(diǎn)變量用于識(shí)別當(dāng)前正被解析的規(guī)范文件。4.如權(quán)利要求1所述的系統(tǒng),其特征在于,該規(guī)范語(yǔ)言語(yǔ)句以可擴(kuò)展標(biāo)記語(yǔ)言語(yǔ)句編寫(xiě)。5.如權(quán)利要求1所述的系統(tǒng),其特征在于,該解析器是由商務(wù)系統(tǒng)的處理器執(zhí)行的應(yīng)用程序。6.如權(quán)利要求1所述的系統(tǒng),其特征在于,商務(wù)邏輯模塊是編程語(yǔ)言對(duì)象。7.如權(quán)利要求6所述的系統(tǒng),其特征在于,編程語(yǔ)言對(duì)象是C++對(duì)象和Java對(duì)象中的一個(gè)。8.如權(quán)利要求2所述的系統(tǒng),其特征在于,進(jìn)一步包括Java應(yīng)用中的Java支持接口,用于生成狀態(tài)機(jī)并且調(diào)用Java對(duì)象和C++對(duì)象之一中所實(shí)現(xiàn)的動(dòng)作。9.如權(quán)利要求3所述的系統(tǒng),其特征在于,其中解析器響應(yīng)于由正被解析的規(guī)范文件中的規(guī)范語(yǔ)言語(yǔ)句所定義的狀態(tài)機(jī)實(shí)現(xiàn)不具有用于處理消息的方法,改變焦點(diǎn)狀態(tài)。10.一種用于控制商務(wù)系統(tǒng)的操作的方法,該商務(wù)系統(tǒng)具有處理器、存儲(chǔ)器和硬盤,其特征在于,該方法包括以規(guī)范語(yǔ)言語(yǔ)句定義商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn);解釋規(guī)范語(yǔ)言語(yǔ)句來(lái)實(shí)現(xiàn)商務(wù)系統(tǒng);以及調(diào)用包含可執(zhí)行編譯程序語(yǔ)句的商務(wù)邏輯模塊來(lái)處理解析器從所解釋的規(guī)范語(yǔ)言語(yǔ)句中提取的消息。11.如權(quán)利要求10所述的方法,其特征在于,規(guī)范語(yǔ)言語(yǔ)句的解釋進(jìn)一步包括在規(guī)范語(yǔ)言語(yǔ)句中定位表達(dá)式標(biāo)簽;根據(jù)定位的表達(dá)式標(biāo)簽解釋在對(duì)應(yīng)的標(biāo)簽之間的規(guī)范語(yǔ)言語(yǔ)句;使用解析器從規(guī)范語(yǔ)言語(yǔ)句中提取的消息來(lái)調(diào)用商務(wù)邏輯模塊。12.如權(quán)利要求10所述的方法,其特征在于,商務(wù)邏輯模塊的調(diào)用進(jìn)一步包括在編程語(yǔ)言對(duì)象中調(diào)用方法。13.如權(quán)利要求10所述的方法,其特征在于,進(jìn)一步包括群集多個(gè)規(guī)范語(yǔ)言文件,其中每個(gè)規(guī)范語(yǔ)言文件都包含定義商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn)的規(guī)范語(yǔ)言語(yǔ)句;以及保留焦點(diǎn)變量來(lái)在當(dāng)前被解析的多個(gè)規(guī)范語(yǔ)言文件中識(shí)別規(guī)范文件。14.如權(quán)利要求10所述的方法,其特征在于,規(guī)范語(yǔ)言語(yǔ)句的解釋進(jìn)一步包括解釋可擴(kuò)展標(biāo)記語(yǔ)言語(yǔ)句。15.如權(quán)利要求10所述的方法,其特征在于,規(guī)范語(yǔ)言語(yǔ)句的解釋包括以商務(wù)系統(tǒng)的處理器運(yùn)行應(yīng)用程序。16.如權(quán)利要求10所述的方法,其特征在于,商務(wù)邏輯模塊的調(diào)用包括調(diào)用編程語(yǔ)言對(duì)象。17.如權(quán)利要求16所述的方法,其特征在于,編程語(yǔ)言對(duì)象的調(diào)用包括調(diào)用C++對(duì)象和Java對(duì)象中的一個(gè)。18.如權(quán)利要求11所述的方法,其特征在于,進(jìn)一步包括通過(guò)包含在狀態(tài)機(jī)實(shí)現(xiàn)的定義中的Java支持接口來(lái)調(diào)用Java動(dòng)作類。19.如權(quán)利要求13所述的方法,其特征在于,進(jìn)一步包括響應(yīng)于由正被解析的規(guī)范文件中的規(guī)范語(yǔ)言語(yǔ)句所定義的狀態(tài)機(jī)實(shí)現(xiàn)不具有用于處理消息的方法,改變焦點(diǎn)狀態(tài)。全文摘要一種系統(tǒng),用于控制具有處理器、存儲(chǔ)器和硬盤的商務(wù)系統(tǒng)的操作。該系統(tǒng)包括存儲(chǔ)在硬盤上的規(guī)范語(yǔ)言文件,該文件包含定義商務(wù)系統(tǒng)的狀態(tài)機(jī)實(shí)現(xiàn)的規(guī)范語(yǔ)言語(yǔ)句;解析器,用于從規(guī)范語(yǔ)言文件中提取規(guī)范語(yǔ)言語(yǔ)句并解釋所提取的規(guī)范語(yǔ)言語(yǔ)句;商務(wù)邏輯應(yīng)用程序,其包括商務(wù)邏輯模塊,該商務(wù)邏輯模塊包括可執(zhí)行的編譯程序語(yǔ)句;以及,解析器調(diào)用至少一個(gè)商務(wù)邏輯模塊來(lái)處理解析器從規(guī)范語(yǔ)言文件中提取的消息。文檔編號(hào)G06F9/44GK101192154SQ20071018664公開(kāi)日2008年6月4日申請(qǐng)日期2007年11月21日優(yōu)先權(quán)日2006年11月30日發(fā)明者大衛(wèi)·D.·米勒申請(qǐng)人:Ncr公司