專利名稱:動(dòng)態(tài)數(shù)據(jù)驅(qū)動(dòng)應(yīng)用集成適配器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理,更具體地說(shuō),涉及軟件應(yīng)用集成的方法、系統(tǒng)和產(chǎn)品。
背景技術(shù):
軟件應(yīng)用集成在提高生產(chǎn)率和降低成本方面至關(guān)重要。通過(guò)使商業(yè)過(guò)程流水線化并集成商業(yè)過(guò)程,公司能夠大大降低運(yùn)行開(kāi)銷。通過(guò)連接商業(yè)支持系統(tǒng)和運(yùn)行支持系統(tǒng),應(yīng)用程序能夠協(xié)調(diào)地工作,而不需要高成本的干預(yù)。通過(guò)脫離點(diǎn)對(duì)點(diǎn)消息接發(fā),公司受益于集中消息接發(fā)基礎(chǔ)結(jié)構(gòu)對(duì)商業(yè)過(guò)程的控制更大,并且運(yùn)行效率提高。
過(guò)去,只有在高成本下實(shí)現(xiàn)軟件應(yīng)用集成。商業(yè)支持系統(tǒng)和運(yùn)行支持系統(tǒng)地組件通常由不同的制造商或開(kāi)發(fā)商開(kāi)始和生產(chǎn),并且利用根本不同的數(shù)據(jù)通信模式。來(lái)自一個(gè)開(kāi)發(fā)商的庫(kù)存管理應(yīng)用程序可通過(guò)例如TCP/IP向由完全不同的公司開(kāi)發(fā)的總分類帳公布庫(kù)存變化。相同的庫(kù)存管理應(yīng)用程序可通過(guò)HTTP以HTML向源于利用第三組數(shù)據(jù)結(jié)構(gòu)的第三個(gè)廠商的購(gòu)買(mǎi)系統(tǒng)公布庫(kù)存變化。利用數(shù)據(jù)結(jié)構(gòu)的第三種組合,購(gòu)買(mǎi)系統(tǒng)可向總分類帳公告。諸如此類。組合是無(wú)盡的。并且過(guò)去,通過(guò)雇用系統(tǒng)分析員,軟件開(kāi)發(fā)項(xiàng)目管理人員,軟件系統(tǒng)設(shè)計(jì)人員,高級(jí)程序員,低級(jí)程序員等來(lái)建立轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu),并管理所有這些根本不同的軟件應(yīng)用系統(tǒng)間的數(shù)據(jù)通信的應(yīng)用集成適配器,來(lái)實(shí)現(xiàn)每個(gè)這樣的集成。
通常以所謂的“點(diǎn)對(duì)點(diǎn)”方式實(shí)現(xiàn)這樣的應(yīng)用集成適配器。即,開(kāi)發(fā)一種適配器,以便通過(guò)利用特定數(shù)據(jù)通信協(xié)議的特定數(shù)據(jù)通信耦接,使特定的庫(kù)存應(yīng)用程序與特定的總分類帳耦接。向該混合物中加入新的應(yīng)用程序需要和待集成的前兩個(gè)應(yīng)用完全相同的新的開(kāi)發(fā)成本。由于這些原因,具有改進(jìn)的應(yīng)用集成設(shè)備和方法理應(yīng)是有利的。
發(fā)明內(nèi)容
本發(fā)明的第一方面提供一種應(yīng)用集成方法,所述方法包括根據(jù)包含描述適配器的數(shù)據(jù)的簡(jiǎn)表(profile),構(gòu)成應(yīng)用集成適配器;接收變更所述適配器的指令;和根據(jù)所述指令變更所述適配器。
更可取地,本發(fā)明提供一種方法,其中應(yīng)用集成適配器包括數(shù)據(jù)通信傳送器和可選的數(shù)據(jù)傳送管理器,所述數(shù)據(jù)通信傳送器包括發(fā)送器和接收器。
更可取地,本發(fā)明提供一種方法,其中描述適配器的數(shù)據(jù)包括識(shí)別通信協(xié)議的數(shù)據(jù),和識(shí)別應(yīng)用程序的數(shù)據(jù)。
更可取地,本發(fā)明提供一種還包括通過(guò)變更后的適配器,在應(yīng)用之間傳遞集成消息的方法。
更可取地,本發(fā)明提供一種方法,其中接收變更適配器的指令還包括檢測(cè)適配器簡(jiǎn)表中的變化。
更可取地,本發(fā)明提供一種方法,其中檢測(cè)適配器簡(jiǎn)表中的變化還包括創(chuàng)建簡(jiǎn)表的副本;和定期比較所述簡(jiǎn)表和所述副本。
更可取地,本發(fā)明提供一種方法,其中接收變更適配器的指令還包括從應(yīng)用程序接收承載變更適配器的指令的管理集成消息。
更可取地,本發(fā)明提供一種方法,其中根據(jù)指令變更適配器還包括更新所述簡(jiǎn)表。
本發(fā)明的第二方面提供一種應(yīng)用集成系統(tǒng),所述系統(tǒng)包括根據(jù)包含描述適配器的數(shù)據(jù)的簡(jiǎn)表,構(gòu)成應(yīng)用集成適配器的裝置;接收變更所述適配器的指令的裝置;和根據(jù)所述指令變更所述適配器的裝置。
更可取地,本發(fā)明提供一種系統(tǒng),其中應(yīng)用集成適配器包括數(shù)據(jù)通信傳送器和可選的數(shù)據(jù)傳送管理器,所述數(shù)據(jù)通信傳送器包括發(fā)送器和接收器。
更可取地,本發(fā)明提供一種系統(tǒng),其中描述適配器的數(shù)據(jù)包括識(shí)別通信協(xié)議的數(shù)據(jù),和識(shí)別應(yīng)用程序的數(shù)據(jù)。
更可取地,本發(fā)明提供一種還包括通過(guò)變更后的適配器,在應(yīng)用之間傳遞集成消息的裝置的方法。
更可取地,本發(fā)明提供一種系統(tǒng),其中接收變更適配器的指令的裝置還包括檢測(cè)適配器簡(jiǎn)表中的變化的裝置。
更可取地,本發(fā)明提供一種系統(tǒng),其中檢測(cè)適配器簡(jiǎn)表中的變化的裝置還包括創(chuàng)建簡(jiǎn)表的副本的裝置;和定期比較所述簡(jiǎn)表和所述副本的裝置。
更可取地,本發(fā)明提供一種系統(tǒng),其中接收變更適配器的指令的裝置還包括從應(yīng)用接收承載變更適配器的指令的管理集成消息的裝置。
更可取地,本發(fā)明提供一種系統(tǒng),其中根據(jù)指令變更適配器的裝置還包括更新所述簡(jiǎn)表的裝置。
本發(fā)明的第三方面提供一種可直接載入數(shù)字計(jì)算機(jī)的內(nèi)部存儲(chǔ)器中的計(jì)算機(jī)程序產(chǎn)品,包含當(dāng)所述產(chǎn)品在計(jì)算機(jī)上運(yùn)行時(shí),實(shí)現(xiàn)權(quán)利要求1-8的發(fā)明的軟件代碼部分。
更可取地,本發(fā)明提供一種應(yīng)用集成計(jì)算機(jī)程序產(chǎn)品,所述計(jì)算機(jī)程序產(chǎn)品包括記錄介質(zhì);記錄在所述記錄介質(zhì)上的根據(jù)包含描述適配器的數(shù)據(jù)的簡(jiǎn)表,構(gòu)成應(yīng)用集成適配器的裝置;記錄在所述記錄介質(zhì)上的接收變更所述適配器的指令的裝置;和記錄在所述記錄介質(zhì)上的根據(jù)所述指令變更所述適配器的裝置。
更可取地,本發(fā)明提供一種計(jì)算機(jī)程序產(chǎn)品,其中應(yīng)用集成適配器包括數(shù)據(jù)通信傳送器和可選的數(shù)據(jù)傳送管理器,所述數(shù)據(jù)通信傳送器包括發(fā)送器和接收器。
更可取地,本發(fā)明提供一種計(jì)算機(jī)程序產(chǎn)品,其中描述適配器的數(shù)據(jù)包括識(shí)別通信協(xié)議的數(shù)據(jù),和識(shí)別應(yīng)用程序的數(shù)據(jù)。
更可取地,本發(fā)明提供一種還包括記錄在所述記錄介質(zhì)上的,通過(guò)變更后的適配器,在應(yīng)用之間傳遞集成消息的裝置的計(jì)算機(jī)程序產(chǎn)品。
更可取地,本發(fā)明提供一種計(jì)算機(jī)程序產(chǎn)品,其中記錄在所述記錄介質(zhì)上的,接收變更適配器的指令的裝置還包括記錄在所述記錄介質(zhì)上的,檢測(cè)適配器簡(jiǎn)表中的變化的裝置。
更可取地,本發(fā)明提供一種計(jì)算機(jī)程序產(chǎn)品,其中記錄在所述記錄介質(zhì)上的,檢測(cè)適配器簡(jiǎn)表中的變化的裝置還包括記錄在所述記錄介質(zhì)上的創(chuàng)建簡(jiǎn)表的副本的裝置;和記錄在所述記錄介質(zhì)上的定期比較所述簡(jiǎn)表和所述副本的裝置。
更可取地,本發(fā)明提供一種計(jì)算機(jī)程序產(chǎn)品,其中記錄在所述記錄介質(zhì)上的,接收變更適配器的指令的裝置還包括記錄在所述記錄介質(zhì)上的,從應(yīng)用接收承載變更適配器的指令的管理集成消息的裝置。
更可取地,本發(fā)明提供一種計(jì)算機(jī)程序產(chǎn)品,其中記錄在所述記錄介質(zhì)上的根據(jù)指令變更適配器的裝置還包括記錄在所述記錄介質(zhì)上的更新所述簡(jiǎn)表的裝置。
本發(fā)明的實(shí)施例實(shí)現(xiàn)應(yīng)用集成的方法。本發(fā)明的實(shí)施例包括根據(jù)包括描述適配器的數(shù)據(jù)的簡(jiǎn)表,構(gòu)成應(yīng)用集成適配器,接收變更所述適配器的指令,和根據(jù)所述指令變更所述適配器。在這樣的實(shí)施例中,應(yīng)用集成適配器包括數(shù)據(jù)通信傳送器和可選的數(shù)據(jù)傳送管理器,所述數(shù)據(jù)通信傳送器包括發(fā)送器和接收器。在典型的實(shí)施例中,描述適配器的數(shù)據(jù)包括識(shí)別通信協(xié)議的數(shù)據(jù)和識(shí)別應(yīng)用程序的數(shù)據(jù)。
本發(fā)明的實(shí)施例包括通過(guò)變更后的適配器在應(yīng)用之間傳遞集成消息。在典型的實(shí)施例中,接收變更適配器的指令包括檢測(cè)適配器簡(jiǎn)表中的變化。在這樣的實(shí)施例中,檢測(cè)適配器簡(jiǎn)表中的變化包括創(chuàng)建簡(jiǎn)表的副本,和定期比較所述簡(jiǎn)表和所述副本。在其它實(shí)施例中,接收變更適配器的指令包括從應(yīng)用接收承載變更適配器的指令的管理集成消息。在這樣的實(shí)施例中,根據(jù)指令變更適配器包括更新所述簡(jiǎn)表。
下面參考附圖,詳細(xì)說(shuō)明
具體實(shí)施例方式
圖1是圖解說(shuō)明根據(jù)本發(fā)明的各個(gè)實(shí)施例的應(yīng)用集成適配器的體系結(jié)構(gòu)的方框圖1a表示提供三個(gè)應(yīng)用的集成的適配器的更詳細(xì)的體系結(jié)構(gòu)例子;
圖1b表示提供應(yīng)用程序的集成的適配器的另一體系結(jié)構(gòu)例子;
圖2是圖解說(shuō)明利用應(yīng)用集成適配器的應(yīng)用集成方法的數(shù)據(jù)流程圖3是圖解說(shuō)明根據(jù)本發(fā)明的創(chuàng)建傳送應(yīng)用集成適配器的接收器和發(fā)送器的方法的流程圖4是圖解說(shuō)明創(chuàng)建傳輸管理器的方法的數(shù)據(jù)流程圖5圖解說(shuō)明根據(jù)本發(fā)明的實(shí)施例,構(gòu)成適配器的類別間的關(guān)系;
圖5a-5h圖解說(shuō)明可用在本發(fā)明的各個(gè)實(shí)施例中的類別結(jié)構(gòu)的例子;
圖6是圖解說(shuō)明構(gòu)成應(yīng)用集成適配器的方法的調(diào)用序列圖7是描述通過(guò)適配器在應(yīng)用程序之間交流集成消息的方法的數(shù)據(jù)流程圖8是描述通過(guò)適配器在應(yīng)用程序之間交流集成消息的另一例證方法的數(shù)據(jù)流程圖9是圖解說(shuō)明通過(guò)適配器在應(yīng)用程序之間交流集成消息的方法的調(diào)用序列圖10是圖解說(shuō)明包括變更適配器的應(yīng)用集成的另一方法的數(shù)據(jù)流程圖11是圖解說(shuō)明包括從應(yīng)用程序接收管理集成消息承載指令,從而變更適配器的應(yīng)用集成的另一方法的數(shù)據(jù)流程圖。
具體實(shí)施例方式
在本說(shuō)明書(shū)中,在很大程度上根據(jù)軟件應(yīng)用集成的方法描述了本發(fā)明。但是,本領(lǐng)域的技術(shù)人員會(huì)認(rèn)識(shí)到包括根據(jù)所公開(kāi)的方式工作的適當(dāng)編程裝置的任何計(jì)算機(jī)系統(tǒng)也落入本發(fā)明的范圍之內(nèi)。
適當(dāng)?shù)木幊萄b置包括指令計(jì)算機(jī)系統(tǒng)執(zhí)行本發(fā)明的方法的步驟的任何裝置,例如包括由與計(jì)算機(jī)存儲(chǔ)器耦接的處理單元和算術(shù)-邏輯電路組成的系統(tǒng),所述系統(tǒng)具有把本發(fā)明的方法的編程步驟保存在計(jì)算機(jī)存儲(chǔ)器中,以便由處理單元執(zhí)行的能力,所述計(jì)算機(jī)存儲(chǔ)器包括保存數(shù)據(jù)和程序指令的電子電路。本發(fā)明也可被具體化為供任何適當(dāng)?shù)臄?shù)據(jù)處理系統(tǒng)之用的計(jì)算機(jī)程序產(chǎn)品,例如磁盤(pán)或者其它記錄介質(zhì)。
使用機(jī)器可讀信息的任何記錄介質(zhì),包括磁介質(zhì),光介質(zhì)或者其它適當(dāng)介質(zhì),可實(shí)現(xiàn)計(jì)算機(jī)程序產(chǎn)品的實(shí)施例。本領(lǐng)域的技術(shù)人員會(huì)立即認(rèn)識(shí)到具有適當(dāng)編程裝置的任何計(jì)算機(jī)系統(tǒng)將能夠執(zhí)行具體化為程序產(chǎn)品的本發(fā)明的方法的步驟。
定義
在本說(shuō)明書(shū)中,除非上下文另有說(shuō)明,否則術(shù)語(yǔ)“字段”、“數(shù)據(jù)元素”和“屬性”一般被用作同義詞,指的是數(shù)字?jǐn)?shù)據(jù)的各個(gè)元素。數(shù)據(jù)元素的集合體被稱為“記錄”或“數(shù)據(jù)結(jié)構(gòu)”。記錄的集合體被稱為“表”或“文件”。表或文件的集合體被稱為“數(shù)據(jù)庫(kù)”。包括成員方法,函數(shù)或軟件例程以及數(shù)據(jù)元素的復(fù)式數(shù)據(jù)結(jié)構(gòu)被稱為“類別”。類別的實(shí)例被稱為“對(duì)象”或者“類別對(duì)象”。
“802.11”指的是IEEE為無(wú)線LAN技術(shù)提出的一系列規(guī)范。802.11規(guī)定無(wú)線客戶機(jī)和基站之間以及兩個(gè)無(wú)線客戶機(jī)之間的空中接口。
“API”是“應(yīng)用編程接口”的縮寫(xiě)。API是用于建立軟件應(yīng)用的一組例程、協(xié)議和工具。
“藍(lán)牙”指的是用于客戶機(jī)設(shè)備之間和客戶機(jī)設(shè)備與LAN或其它網(wǎng)絡(luò)上的資源之間的RF耦接的短程無(wú)線電技術(shù)的工業(yè)規(guī)范。稱為藍(lán)牙特別興趣小組的管理團(tuán)體測(cè)試并證明設(shè)備符合藍(lán)牙標(biāo)準(zhǔn)。藍(lán)牙規(guī)范由提供設(shè)計(jì)規(guī)范的‘Foundation Core’和提供互用性準(zhǔn)則的‘Foundation Profile’組成。
“CORBA”表示公用對(duì)象請(qǐng)求代理體系結(jié)構(gòu),由對(duì)象管理組(OMG)首先于1991年公布的遠(yuǎn)程過(guò)程調(diào)用的標(biāo)準(zhǔn)。CORBA可被看作一種實(shí)現(xiàn)“RPC”或者遠(yuǎn)程過(guò)程調(diào)用的面向?qū)ο蟮姆绞剑贿^(guò)CORBA支持并不如此存在于RPC中的許多特征。通過(guò)使用CORBA技術(shù),用面向?qū)ο蟮木幊陶Z(yǔ)言,例如Java和C++實(shí)現(xiàn)的遠(yuǎn)程方法調(diào)用好象是本地對(duì)象中本地成員方法。
CORBA數(shù)據(jù)通信由稱為對(duì)象請(qǐng)求代理或者‘ORB’的中間件應(yīng)用管理。ORB與“GIOP”(通用ORB間協(xié)議)通信,GIOP是定義在不同種類的計(jì)算機(jī)及它們的各種體系結(jié)構(gòu)之中傳遞消息的結(jié)構(gòu)和格式的CORBA協(xié)議。GIOP并不基于任何特定的網(wǎng)絡(luò)協(xié)議,例如IPX或者TCP/IP。定義為在其最廣泛使用的通信傳送平臺(tái)TCP/IP內(nèi)發(fā)揮作用的GIOP被稱為“IIOP”(因特網(wǎng)ORB間協(xié)議)。由于TCP/IP的通用性,在描述例證實(shí)施例方面,本公開(kāi)趨向于或多或少地交替使用術(shù)語(yǔ)GIOP和IIOP,不過(guò)術(shù)語(yǔ)IIOP的使用并不意圖把本發(fā)明的實(shí)施例的應(yīng)用限制于單一的傳輸協(xié)議組TCP/IP。
“CGI”表示“公共網(wǎng)關(guān)接口”,一種web服務(wù)器和web客戶機(jī)之間的資源的數(shù)據(jù)通信的標(biāo)準(zhǔn)技術(shù)。更具體地說(shuō),CGI提供服務(wù)器和服務(wù)器方‘網(wǎng)關(guān)’程序之間的標(biāo)準(zhǔn)接口,服務(wù)器方‘網(wǎng)關(guān)’程序管理相對(duì)于文件系統(tǒng)和數(shù)據(jù)庫(kù)的實(shí)際讀取和寫(xiě)入。CGI接口一般通過(guò)環(huán)境變量或者以將通過(guò)它們的標(biāo)準(zhǔn)輸入由網(wǎng)關(guān)程序讀取的數(shù)據(jù)的形式,把數(shù)據(jù)發(fā)送給網(wǎng)關(guān)程序。網(wǎng)關(guān)程序一般通過(guò)標(biāo)準(zhǔn)輸出返回?cái)?shù)據(jù)。
“數(shù)據(jù)通信的耦接”表示任何形式的數(shù)據(jù)通信,無(wú)線、802.11b、藍(lán)牙、紅外、無(wú)線電、網(wǎng)際協(xié)議、HTTP協(xié)議、電子郵件協(xié)議、連網(wǎng)、直接連接、專用電話線、撥號(hào)、EIA232(RS-232)串行連接、IEEE1394(常稱為‘火線’連接,蘋(píng)果計(jì)算機(jī)公司的商標(biāo))、通用串行總線(“USB”)、硬連線并行端口連接、和本領(lǐng)域的技術(shù)人員易于想到的其它形式的數(shù)據(jù)通信。數(shù)據(jù)通信的耦接包括文件的共享,包括從應(yīng)用到應(yīng)用,從適配器到應(yīng)用程序,或者從應(yīng)用程序到適配器的傳送文件,包括平面文件、二進(jìn)制文件、文本文件、數(shù)據(jù)庫(kù)文件、HTML文件、XML文檔等。
“DCOM”表示“分布式組件對(duì)象模型”,一種支持分布在網(wǎng)絡(luò)間的對(duì)象的微軟的組件對(duì)象模型(“COM”)的擴(kuò)展。DCOM是某些微軟操作系統(tǒng)(包括Windows NT)的一部分,并且適用于其它操作系統(tǒng)。DCOM起和IBM的DSOM協(xié)議相同的用途,IBM的DSOM是CORBA的普及實(shí)現(xiàn)。和在許多操作系統(tǒng)上運(yùn)行的CORBA不同,目前只為Windows實(shí)現(xiàn)了DCOM。
“格式”或“數(shù)據(jù)格式”指的是用于數(shù)據(jù)處理和數(shù)據(jù)通信的數(shù)據(jù)編碼的全部形式。數(shù)據(jù)格式的例子包括編碼成HTML文檔,XML文檔,Java數(shù)據(jù)結(jié)構(gòu),C++數(shù)據(jù)結(jié)構(gòu),C數(shù)據(jù)結(jié)構(gòu)等形式的數(shù)據(jù)。除了格式之外,計(jì)算機(jī)數(shù)據(jù)具有包括數(shù)據(jù)元素名稱,數(shù)據(jù)元素類型和數(shù)據(jù)元素值的結(jié)構(gòu)。在本公開(kāi)中,改變或轉(zhuǎn)換數(shù)據(jù)的結(jié)構(gòu)被稱為“數(shù)據(jù)變換”或“變換”(transformation)。
“HTML”代表‘超文本置標(biāo)語(yǔ)言’,一種在瀏覽器上顯示web頁(yè)的標(biāo)準(zhǔn)置標(biāo)語(yǔ)言。
“HTTP”代表‘超文本傳送協(xié)議’,萬(wàn)維網(wǎng)的標(biāo)準(zhǔn)數(shù)據(jù)通信協(xié)議。
“JMS”表示“Java消息服務(wù)”,專門(mén)為應(yīng)用集成消息接發(fā)設(shè)計(jì)的Java API。JMS提供一種支持消息業(yè)務(wù)的異步管理的Java enterprisebean。JMS發(fā)送和接收能夠參與通過(guò)Java事務(wù)API(“JTA”)控制的事務(wù)。JTA配合Java事務(wù)服務(wù)(“JTS”)工作。JTA允許應(yīng)用和應(yīng)用服務(wù)器訪問(wèn)事務(wù)。JTS規(guī)定支持JTA的事務(wù)管理器的實(shí)現(xiàn),并在低于API的層次實(shí)現(xiàn)OMG對(duì)象事務(wù)服務(wù)(“OTS”)的Java映射。JTS利用IIOP擴(kuò)展事務(wù)。
“IMAP”表示因特網(wǎng)消息存取協(xié)議’。IMAP是一種用于從因特網(wǎng)電子郵件服務(wù)器取回電子郵件消息的協(xié)議。在“離線”操作中,電子郵件客戶機(jī)把消息從電子郵件服務(wù)器提取到正在運(yùn)行電子郵件客戶程序的客戶機(jī)。在“在線”操作中,消息可被留在電子郵件服務(wù)器上,由電子郵件客戶程序遠(yuǎn)程處理。POP支持離線電子郵件操作。IMAP(更新的協(xié)議)既支持離線電子郵件操作又支持在線電子郵件操作。
“LAN”表示‘局域網(wǎng)’。
在本說(shuō)明書(shū)中,“網(wǎng)絡(luò)”用于表示用于計(jì)算機(jī)或計(jì)算機(jī)系統(tǒng)之中的數(shù)據(jù)通信的任何連網(wǎng)耦接??膳c本發(fā)明一起使用的網(wǎng)絡(luò)的例子包括企業(yè)內(nèi)部網(wǎng),外聯(lián)網(wǎng),局域網(wǎng),廣域網(wǎng)和本領(lǐng)域的技術(shù)人員易于想到的其它網(wǎng)絡(luò)結(jié)構(gòu)。
“POP”表示‘郵局協(xié)議’。POP是一種由電子郵件客戶機(jī)用于從郵件服務(wù)器取回電子郵件的協(xié)議。存在兩種形式的POP。POP2要求SMTP從客戶機(jī)或者其它服務(wù)器接收電子郵件消息。更新的版本POP3能夠在有或沒(méi)有SMTP的情況下使用。
“偽代碼”是在本公開(kāi)中用于解釋的編程語(yǔ)言的例證源代碼或者置標(biāo)語(yǔ)言的置標(biāo)的例子。偽代碼未被表示成嚴(yán)格遵守任何特定的編程語(yǔ)言或置標(biāo)語(yǔ)言的要求,從而不存在出自本公開(kāi)內(nèi)容的偽代碼例子將編譯或執(zhí)行的任何表示。但是,偽代碼例子將有助于說(shuō)明,以使本領(lǐng)域的技術(shù)人員能夠根據(jù)本發(fā)明的實(shí)施例,產(chǎn)生和使用應(yīng)用集成適配器。
“RMI”指的是“遠(yuǎn)程方法調(diào)用”,由太陽(yáng)微系統(tǒng)公司開(kāi)發(fā)的協(xié)議組,使Java對(duì)象能夠遠(yuǎn)程與其它Java對(duì)象通信。RMI是一種相當(dāng)簡(jiǎn)單的協(xié)議,但是不同于諸如CORBA和DCOM之類更復(fù)雜的協(xié)議,它只對(duì)Java對(duì)象起作用。CORBA和DCOM支持用任何語(yǔ)言創(chuàng)建的對(duì)象之間的連網(wǎng)通信和遠(yuǎn)程過(guò)程調(diào)用。
本說(shuō)明書(shū)中的“服務(wù)器”指的是包含網(wǎng)絡(luò)上的管理資源和對(duì)資源的訪問(wèn)請(qǐng)求的自動(dòng)化計(jì)算機(jī)器的計(jì)算機(jī)或設(shè)備?!鞍踩?wù)器”可以是通過(guò)使用根據(jù)本發(fā)明的安全對(duì)象,管理對(duì)資源的訪問(wèn)的任何服務(wù)器。“web服務(wù)器”或者特別是“HTTP服務(wù)器”是借助HTTP與瀏覽器通信,以便管理和使連網(wǎng)計(jì)算機(jī)能夠得到用置標(biāo)語(yǔ)言,比如HTML編寫(xiě)的文檔,數(shù)字對(duì)象和其它資源的服務(wù)器。
“小服務(wù)程序”(servlet),比如小應(yīng)用程序(applet)是用來(lái)從另一程序,而不是直接從操作系統(tǒng)運(yùn)行的程序?!靶》?wù)程序”尤其被設(shè)計(jì)成從小服務(wù)程序的常規(guī)Java接口在服務(wù)器上運(yùn)行。小服務(wù)程序是擴(kuò)展面向請(qǐng)求/響應(yīng)的服務(wù)器,例如允許Java的web服務(wù)器的模塊。Java小服務(wù)程序是CGI程序的替換物。兩者之間的最大差別在于Java小服務(wù)程序是持久的。一旦小服務(wù)程序被啟動(dòng),它就停留在存儲(chǔ)器中,并且能夠?qū)崿F(xiàn)多個(gè)請(qǐng)求。相反,CGI程序在其被執(zhí)行一次之后就消失,每次加載和運(yùn)行只能實(shí)現(xiàn)一個(gè)請(qǐng)求。Java小服務(wù)程序的持久性使得它們一般快于CGI,因?yàn)樵谑状沃?,不花費(fèi)時(shí)間來(lái)加載供調(diào)用的小服務(wù)程序。
“SMTP”表示“簡(jiǎn)單消息傳送協(xié)議”。SMTP是在服務(wù)器之間發(fā)送電子郵件消息的協(xié)議。因特網(wǎng)電子郵件通信量主要通過(guò)SMTP從一個(gè)服務(wù)器到達(dá)另一服務(wù)器。在電子郵件到達(dá)目標(biāo)服務(wù)器之后,電子郵件客戶機(jī)隨后使用POP或者IMAP從所述服務(wù)器取回電子郵件消息。SMTP還被用于把消息從郵件客戶機(jī)發(fā)送給郵件服務(wù)器。
“SOAP”是簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,一種與平臺(tái)無(wú)關(guān)的用于因特網(wǎng)上的應(yīng)用通信的協(xié)議。SOAP包括用于表示遠(yuǎn)程過(guò)程調(diào)用和響應(yīng)的協(xié)定。SOAP可能可以和各種傳送協(xié)議一起使用,不過(guò)到目前為止,它主要和HTTP一起使用。SOAP一般使用XML來(lái)定義消息格式,隨后增加用于數(shù)據(jù)通信的HTTP報(bào)頭。
“TCP/IP”指的是實(shí)現(xiàn)數(shù)據(jù)通信協(xié)議的標(biāo)準(zhǔn)ISO協(xié)議組的網(wǎng)絡(luò)層和傳輸層的兩種數(shù)據(jù)通信協(xié)議。嚴(yán)格地說(shuō),“TCP”(傳輸控制協(xié)議)是駐留在“IP”(網(wǎng)際協(xié)議)之上的獨(dú)立一層。不過(guò),這兩者通常被一起表示成“TCP/IP協(xié)議組”。
“URI”或者“統(tǒng)一資源標(biāo)識(shí)符”是可通過(guò)網(wǎng)絡(luò)訪問(wèn)的任何名稱空間中的命名對(duì)象。URI適用于任何訪問(wèn)方案,例如包括文件傳送協(xié)議或者說(shuō)“FTP”,Gopher和the web。本發(fā)明的典型實(shí)施例中使用的URI一般包括網(wǎng)際協(xié)議地址,或者解析為網(wǎng)際協(xié)議地址的域名,識(shí)別資源,特別是網(wǎng)頁(yè)、CGI腳本或者小服務(wù)程序在網(wǎng)絡(luò)(通常是因特網(wǎng),一種在其ISO網(wǎng)絡(luò)層中使用網(wǎng)際協(xié)議的網(wǎng)絡(luò))上所處的位置。指向特定資源,比如特定的HTML文件,CGI腳本或者小服務(wù)程序的URI一般包括定位并識(shí)別通過(guò)服務(wù)器與網(wǎng)絡(luò)耦接的文件系統(tǒng)中的特定資源的路徑名或者文件名。在特定資源,例如CGI文件或者小服務(wù)程序是可執(zhí)行的,例如保存或取回?cái)?shù)據(jù)的情況下,URI通常包括查詢參數(shù),或者要保存的數(shù)據(jù),以編碼到URI中的數(shù)據(jù)的形式。這樣的參數(shù)或者要保存的數(shù)據(jù)被稱為“URI編碼數(shù)據(jù)”。
“URL”或者說(shuō)“統(tǒng)一資源定位符”包含一種URI的子集,其中每個(gè)URL解析成某一網(wǎng)絡(luò)地址。即,URI和URL是有區(qū)別的,因?yàn)閁RI識(shí)別名稱空間中的命名對(duì)象,所述名稱可以也可不解析為地址,而URL確實(shí)解析為地址。雖然目前基于URI編寫(xiě)標(biāo)準(zhǔn),不過(guò)仍然常見(jiàn)用于使web數(shù)據(jù)位置與數(shù)據(jù)通信的網(wǎng)絡(luò)地址相聯(lián)系的這種稱為“URL”的與web相關(guān)的標(biāo)識(shí)符。本說(shuō)明書(shū)把這樣的標(biāo)識(shí)符統(tǒng)稱為URI。
“WAN”意味著“廣域網(wǎng)”,WAN的一個(gè)例子是因特網(wǎng)。
“萬(wàn)維網(wǎng)”或者更簡(jiǎn)單地“the web”指的是支持特別格式化的文檔(以置標(biāo)語(yǔ)言,例如HTML,XML(可擴(kuò)展的置標(biāo)語(yǔ)言),WML(無(wú)線置標(biāo)語(yǔ)言),或者HDML(手持設(shè)備置標(biāo)語(yǔ)言)格式化的文檔)的網(wǎng)際協(xié)議(“IP”)服務(wù)器的體系。本說(shuō)明書(shū)中使用的術(shù)語(yǔ)“Web”還表示實(shí)現(xiàn)超鏈接協(xié)議,比如HTTP或者WAP(“無(wú)線訪問(wèn)協(xié)議”),支持URI和用置標(biāo)語(yǔ)言編寫(xiě)的文檔的任何服務(wù)器或者連接的一組或者互連的多組服務(wù)器,與這樣的服務(wù)器或者多組服務(wù)器本身是否與萬(wàn)維網(wǎng)耦接無(wú)關(guān)。
“XML”指的是“可擴(kuò)展置標(biāo)語(yǔ)言”,一種使數(shù)據(jù)結(jié)構(gòu)化的已知標(biāo)準(zhǔn)。XML被用于提供靈活并且可修改的信息格式化和標(biāo)識(shí)。XML被稱為是可擴(kuò)展的,因?yàn)樗幌馠TML(超文本置標(biāo)語(yǔ)言,它是一組預(yù)定的置標(biāo))那樣具有任何固定的格式。相反,XML實(shí)際上是一種“元語(yǔ)言”-一種描述其它語(yǔ)言的語(yǔ)言-它允許用戶為許多不同類型的文檔設(shè)計(jì)定制的置標(biāo)語(yǔ)言。但是,XML本身不是編程語(yǔ)言;它是一種使數(shù)據(jù)結(jié)構(gòu)化的置標(biāo)標(biāo)準(zhǔn)。但是,在本公開(kāi)中,由于XML具有對(duì)計(jì)算機(jī)數(shù)據(jù)編碼或者使之結(jié)構(gòu)化的效果,因此XML文檔和XSL規(guī)范的準(zhǔn)備(盡管它們本身可能不由計(jì)算機(jī)程序員執(zhí)行)仍然被看作計(jì)算機(jī)編程或者軟件開(kāi)發(fā)。
類似于HTML,XML利用元素,標(biāo)記和屬性。元素是由標(biāo)記識(shí)別的內(nèi)容段。元素可能具有空值,元素的實(shí)例的值是所述元素的實(shí)例的起始標(biāo)記和終止標(biāo)記之間的字符串。“標(biāo)記”是由“<”和“>”括起來(lái)的單詞,屬性是元素的定義的特性,例如具有下述形式AttributeName=“Value”。雖然HTML規(guī)定每個(gè)標(biāo)記和屬性意味什么,并且通常規(guī)定它們之間的文本在瀏覽器中看起來(lái)如何,不過(guò)XML只使用標(biāo)記來(lái)劃定各段數(shù)據(jù)的界限,把數(shù)據(jù)的解釋完全留給讀取數(shù)據(jù)的應(yīng)用程序。換句話說(shuō),雖然在HTML的預(yù)定語(yǔ)法中,“<p>”表示“段落”,不過(guò)在XML文件中,“<p>”表示讀取應(yīng)用程序表達(dá)它意味的不論什么。根據(jù)上下文,它可以是價(jià)格,參數(shù),人,或者在許多情況下,它代表與Ps無(wú)關(guān)的某一實(shí)體。
“XSL”指的是“可擴(kuò)展樣式語(yǔ)言”,一種當(dāng)創(chuàng)建HTML或者XML頁(yè)時(shí),把樣式與內(nèi)容分開(kāi)的規(guī)范。XSL規(guī)范非常類似于模板,允許用戶和設(shè)計(jì)人員對(duì)多頁(yè)應(yīng)用單一的樣式文檔。XSL是由萬(wàn)維網(wǎng)聯(lián)盟提供的第二種樣式規(guī)范。稱為級(jí)聯(lián)樣式表的第一種樣式規(guī)范類似于XSL,但是不包括兩種主要的XSL的革新-允許開(kāi)發(fā)人員規(guī)定打印網(wǎng)頁(yè)的方式,和一種在本發(fā)明的許多實(shí)施例中特別有用的革新,允許用戶或開(kāi)發(fā)人員跨越不同的應(yīng)用轉(zhuǎn)移XML文檔的規(guī)范。即,XSL具有規(guī)定用XML表述的數(shù)據(jù)結(jié)構(gòu)的變換的能力。
“XSLT”指的是“可擴(kuò)展樣式語(yǔ)言變換”,在XSL樣式表中用于把XML文檔變換成其它XML文檔的語(yǔ)言。XSL處理器讀取XML文檔并遵循XSL樣式表中的指令;隨后它輸出新的XML文檔或者XML文檔片段。這在本發(fā)明的需要把相同的數(shù)據(jù)格式轉(zhuǎn)換成用XML表示的不同結(jié)構(gòu)的各個(gè)實(shí)施例中特別有用。
應(yīng)用集成
本發(fā)明的實(shí)施例提供能夠在各種計(jì)算機(jī)體系結(jié)構(gòu)中實(shí)現(xiàn)數(shù)據(jù)變換,數(shù)據(jù)轉(zhuǎn)譯(translation)和數(shù)據(jù)通信的應(yīng)用集成適配器。圖1、1a和1b圖解說(shuō)明由根據(jù)本發(fā)明的各個(gè)實(shí)施例的應(yīng)用集成適配器(“適配器”)支持或者與之一起使用的幾種結(jié)構(gòu)布置。這些圖還表示根據(jù)本發(fā)明的各個(gè)實(shí)施例的適配器本身的一些結(jié)構(gòu)形態(tài)。
圖1表示了適配器之間的數(shù)據(jù)通信體系結(jié)構(gòu)。根據(jù)圖1的一種體系結(jié)構(gòu),適配器(102)把在安全防火墻(128)內(nèi)的應(yīng)用(106)的功能與在防火墻(128)的另一側(cè)的應(yīng)用(116)結(jié)合起來(lái)。適配器通過(guò)WAN(126)與在防火墻(128)之外的應(yīng)用(116)耦接(118)以便進(jìn)行數(shù)據(jù)通信。適配器與在防火墻(128)之內(nèi),事實(shí)上與適配器(102)一起安裝在相同的應(yīng)用服務(wù)器(104)上的應(yīng)用(116)耦接(106)以便進(jìn)行數(shù)據(jù)通信。
用于數(shù)據(jù)通信的耦接包括數(shù)據(jù)通信的任何方法,設(shè)備或者協(xié)議,光學(xué)耦接,電耦接,機(jī)械耦接或者其它耦接。用于數(shù)據(jù)通信的耦接必定包括所有數(shù)據(jù)通信協(xié)議和遠(yuǎn)程過(guò)程協(xié)議,比如HTTP、CORBA、DCOM、IIOP、GIOP、RMI、SOAP等。
用于數(shù)據(jù)通信的耦接包括通過(guò)簡(jiǎn)單網(wǎng)絡(luò)尋呼協(xié)議或者說(shuō)“SNPP”,對(duì)由電話號(hào)碼識(shí)別的無(wú)線尋呼機(jī)客戶機(jī)的消息接發(fā),簡(jiǎn)單網(wǎng)絡(luò)尋呼協(xié)議的第3版是如同在RFC1861中定義的增強(qiáng)的雙向協(xié)議。RFC1861是由因特網(wǎng)工程任務(wù)組中的網(wǎng)絡(luò)工作組公布的因特網(wǎng)協(xié)議組規(guī)范文檔。
用于數(shù)據(jù)通信的耦接包括對(duì)無(wú)線尋呼機(jī)客戶機(jī)WCTP(“無(wú)線通信傳送協(xié)議”)的消息接發(fā)。WCTP是另一種雙向消息接發(fā)協(xié)議。在抱著使用HTTP作為其傳送機(jī)制的特殊目的的情況下設(shè)計(jì)了WCTP。WCTP是由PCIA(個(gè)人通信工作協(xié)會(huì))的成員發(fā)布的一種開(kāi)放的非專有行業(yè)標(biāo)準(zhǔn)。
用于數(shù)據(jù)通信的耦接包括通過(guò)許多專有瞬時(shí)消息接發(fā)協(xié)議中的任意一種,經(jīng)HTTP傳送的消息接發(fā),所有這些協(xié)議都具有只適合于這種用途,即,供諸如PVR之類消息接發(fā)應(yīng)用程序之用的應(yīng)用編程接口(“API”)。具有API的這種瞬時(shí)消息接發(fā)協(xié)議的例子包括可從美國(guó)在線(“AOL”),微軟網(wǎng)絡(luò)(“MSN”),雅虎、Imici公司和ICQ公司獲得的那些瞬時(shí)消息接發(fā)協(xié)議。
用于數(shù)據(jù)通信的耦接包括在任意類型的設(shè)備、個(gè)人計(jì)算機(jī)、膝上型計(jì)算機(jī)、手持式設(shè)備、蜂窩電話機(jī)、服務(wù)器等上的適配器和應(yīng)用之間,通過(guò)SMTP、POP、IMAP或者其它電子郵件協(xié)議,以電子郵件的形式傳送消息。
用于數(shù)據(jù)通信的耦接包括由任何電信公司支持的短消息業(yè)務(wù)(“SMS”)或者電話業(yè)務(wù)。SMS提供一種相對(duì)于無(wú)線設(shè)備傳送短消息的機(jī)制。SMS支持以類似于字母-數(shù)字尋呼的方式,從適配器到應(yīng)用程序的短文本消息的傳輸。SMS利用短消息服務(wù)中心(“SMSC”),短消息服務(wù)中心充當(dāng)短消息的存儲(chǔ)轉(zhuǎn)發(fā)系統(tǒng)。與諸如字母數(shù)字尋呼之類的其它現(xiàn)有文本消息傳輸業(yè)務(wù)相反,SMS是一種可靠的系統(tǒng),提供保證到目的地的文本消息的傳送的機(jī)制。另外,SMS支持允許與不同消息源和目的地的互連的數(shù)個(gè)輸入機(jī)構(gòu)。例如,適配器,或者其發(fā)送器或接收器能夠起所謂的“外部短消息實(shí)體”(“ESME”)的作用,并以HTTP表格或者電子郵件消息的形式傳送SMS消息。適配器能夠起移動(dòng)始發(fā)者(“MO”),即允許SMS的客戶機(jī)設(shè)備或者實(shí)際上蜂窩電話機(jī)的作用。SMS是一個(gè)顯著特征在于允許SMS的客戶機(jī)能夠在任何時(shí)候接收或者提交短消息,與是否正在進(jìn)行語(yǔ)音或者數(shù)據(jù)呼叫無(wú)關(guān)。
用于數(shù)據(jù)通信的耦接包括除了數(shù)據(jù)通信協(xié)議之外的數(shù)據(jù)耦接方法,例如包括共享存儲(chǔ)器區(qū)段,它可能是在其中適配器(102)與所述適配器集成的應(yīng)用(106)一起被安裝在相同服務(wù)器(104)上的體系結(jié)構(gòu)中利用的非常好的方法。應(yīng)用(106)內(nèi)的通信模塊和具有適配器(102)的通信模塊,例如本公開(kāi)中下面更詳細(xì)討論的接收器和發(fā)送器可被實(shí)現(xiàn)成在使用信號(hào)標(biāo)志管理互斥的情況下,通過(guò)共享存儲(chǔ)器區(qū)段,傳遞消息的同步Java方法或者C或C++線程。
如上所述,用于數(shù)據(jù)通信的耦接包括有線網(wǎng)絡(luò)協(xié)議以及無(wú)線網(wǎng)絡(luò)協(xié)議和消息接發(fā)系統(tǒng)。但是,用于數(shù)據(jù)通信的耦接另外還包括非連網(wǎng)耦接,包括符合RS-232(EIA232),IEEE1394(通常稱為“火線”連接,蘋(píng)果計(jì)算機(jī)公司的商標(biāo))的有線串行耦接,硬連線并行端口連接和本領(lǐng)域的技術(shù)人員易于想到的其它直接的有線耦接。
根據(jù)圖1的另一例證體系結(jié)構(gòu),在客戶機(jī)工作站(132)上的適配器(136)把安裝在同一工作站上的應(yīng)用(134)的功能與通過(guò)LAN(130)與所述工作站耦接(136)以便進(jìn)行數(shù)據(jù)通信的服務(wù)器上的應(yīng)用(116)結(jié)合起來(lái)。由于適配器(136)和應(yīng)用(134)在相同的計(jì)算機(jī)上,因此甚至通過(guò)共享存儲(chǔ)器區(qū)段或者通過(guò)本領(lǐng)域的技術(shù)人員易于想到的在相同計(jì)算機(jī)上執(zhí)行程序或線程以便相互通信的其它方法,適配器(136)和應(yīng)用(134)之間的用于數(shù)據(jù)通信的耦接(108)可被實(shí)現(xiàn)成對(duì)工作站上的軟件程序或模塊的本地調(diào)用。雖然利用耦接在服務(wù)器(114)和工作站(132)之間的LAN(130)表示該特定的體系結(jié)構(gòu)例子,不過(guò)讀者如今明白工作站可以是筆記本計(jì)算機(jī),用于數(shù)據(jù)通信的耦接(136)可以是直接通過(guò)服務(wù)器(114)和工作站(132)之間的導(dǎo)線的RS232或USB連接。
根據(jù)圖1的另一例證體系結(jié)構(gòu),適配器(102)集成三個(gè)應(yīng)用(106、112、116)的功能。適配器(102)通過(guò)WAN(126)與一個(gè)應(yīng)用(116)耦接(116)以便進(jìn)行數(shù)據(jù)通信。適配器(102)與和所述適配器一起安裝在相同服務(wù)器(104)上的另一應(yīng)用(106)耦接(108)以便進(jìn)行數(shù)據(jù)通信。適配器(102)通過(guò)LAN(124)與和適配器(102)一起在相同防火墻(128)之后的第二服務(wù)器(110)上的第三應(yīng)用(112)耦接(126)以便進(jìn)行數(shù)據(jù)通信。在這種體系結(jié)構(gòu)中,如果應(yīng)用(116)是精煉廠中的庫(kù)存管理程序,應(yīng)用(106)是公司總部中的服務(wù)器上的總分類帳,應(yīng)用(112)是在和所述總部位于相同公司場(chǎng)地的另一建筑物中的采購(gòu)系統(tǒng),那么采購(gòu)系統(tǒng)可通過(guò)HTTP把關(guān)于庫(kù)存變化的公布消息傳送給適配器(102),適配器(102)可通過(guò)共享存儲(chǔ)器區(qū)段把所述公布消息轉(zhuǎn)發(fā)給總分類帳,并通過(guò)SOAP、IIOP或者RMI把所述公布消息轉(zhuǎn)發(fā)給采購(gòu)系統(tǒng)。采購(gòu)系統(tǒng)和總分類帳可對(duì)庫(kù)存管理程序報(bào)以確認(rèn)消息。采購(gòu)系統(tǒng)可以只把關(guān)于新采購(gòu)的公布消息傳送給總分類帳,而不抄送給庫(kù)存管理系統(tǒng)??偡诸悗た梢灾幌虿少?gòu)系統(tǒng)發(fā)送確認(rèn),而不抄送給庫(kù)存管理程序。所有這三個(gè)應(yīng)用都能夠在它們的消息中利用由三個(gè)不同的軟件開(kāi)發(fā)公司毫無(wú)協(xié)調(diào)地開(kāi)發(fā)的完全不同的數(shù)據(jù)結(jié)構(gòu)。
圖1a表示提供三個(gè)應(yīng)用(106、112、116)的集成的適配器(102)的更詳細(xì)體系結(jié)構(gòu)例子。圖1a的例子包括稱為“傳送器”(transport)的三個(gè)軟件模塊(140、142、144),它們?cè)诟鶕?jù)本發(fā)明的實(shí)施例的許多適配器中被用于執(zhí)行數(shù)據(jù)通信和消息格式轉(zhuǎn)譯。圖1a的例證適配器包括圖(105),一種繪制傳送器之間的消息路線的圖的數(shù)據(jù)結(jié)構(gòu)。即,根據(jù)本發(fā)明的實(shí)施例的許多適配器根據(jù)路由圖(route map)在傳送器之間,于是在應(yīng)用之間路由消息。繼續(xù)庫(kù)存管理程序,總分類賬和采購(gòu)系統(tǒng)的例子,圖1a的適配器(102)通過(guò)利用路由圖(105)能夠了解
來(lái)自采購(gòu)系統(tǒng)的公布消息只被發(fā)送給總分類帳,不被發(fā)送給庫(kù)存控制程序;
來(lái)自總分類賬的采購(gòu)公布確認(rèn)消息只被發(fā)送給采購(gòu)系統(tǒng),不被發(fā)送給庫(kù)存管理程序;
來(lái)自庫(kù)存管理程序的公布消息既被發(fā)送給總分類帳,又被發(fā)送給采購(gòu)系統(tǒng);
來(lái)自總分類帳的庫(kù)存公布確認(rèn)消息只被發(fā)送給庫(kù)存管理程序;和
來(lái)自采購(gòu)系統(tǒng)的庫(kù)存公布確認(rèn)消息只被發(fā)送給庫(kù)存管理程序。
有利的是,只具有兩個(gè)傳送器,并且只集成兩個(gè)應(yīng)用的簡(jiǎn)單適配器可在無(wú)路由圖的情況下工作,把來(lái)自任何一個(gè)應(yīng)用的所有消息發(fā)送給另一應(yīng)用,而不管消息的類型。圖1a的例子圖解說(shuō)明適配器中路由圖的實(shí)用性,但是在該例子中,依據(jù)消息類型,消息源和消息目的地索引路由圖。圖1a的例子只圖解說(shuō)明了只利用三個(gè)適配器集成的三個(gè)應(yīng)用,并且本公開(kāi)只討論了少數(shù)消息類型。鑒于在根據(jù)本發(fā)明的實(shí)施例中,對(duì)適配器中的傳送器的數(shù)目或者能夠被有效集成的應(yīng)用的數(shù)目沒(méi)有任何限制的事實(shí),路由圖的實(shí)用性是明顯的。
圖1b表示了提供應(yīng)用(112、116)的集成的適配器(102)的另一體系結(jié)構(gòu)例子。在圖1b的例子中,傳送器(142、144)包括稱為“接收器”(312)和“發(fā)送器”(316)的附加軟件模塊,它們?cè)诟鶕?jù)本發(fā)明的實(shí)施例的許多適配器中被用于執(zhí)行適配器和軟件應(yīng)用之間的數(shù)據(jù)通信。在圖1b中舉例說(shuō)明的這種實(shí)施例中,接收器和發(fā)送器均管理它們自己的用于數(shù)據(jù)通信的耦接(118、119、126、127)。另外,本發(fā)明對(duì)耦接的類型沒(méi)有任何限制。即,在根據(jù)本發(fā)明的實(shí)施例的特定的例證適配器中,傳送器(142)中的接收器(312)能夠以按照SOAP的消息通信量的形式實(shí)現(xiàn)其用于與應(yīng)用的數(shù)據(jù)通信的耦接,而相同傳送器(142)中的發(fā)送器(316)能夠以明文HTTP“公布”消息的形式發(fā)送其消息通信量。
圖2是圖解說(shuō)明利用應(yīng)用集成適配器的應(yīng)用集成方法的數(shù)據(jù)流程圖。具體地說(shuō),圖2的方法包括構(gòu)成(204)應(yīng)用集成適配器,其中根據(jù)包含描述所述適配器的數(shù)據(jù)的簡(jiǎn)表(202)進(jìn)行所述構(gòu)成。圖2的方法還包括提供(210)包含至少兩個(gè)通信傳送器的標(biāo)識(shí)(214)的適配器簡(jiǎn)表,包括數(shù)據(jù)通信傳送器的配置參數(shù)(218)。在根據(jù)本發(fā)明的適配器的許多實(shí)施例中,提供(210)簡(jiǎn)表由通過(guò)字處理器或者文本編輯器,鍵入指定用作簡(jiǎn)表的文本文件(描述適配器的組件的數(shù)據(jù)結(jié)構(gòu)的表現(xiàn))的用戶或開(kāi)發(fā)人員完成。所述表現(xiàn)可以是數(shù)據(jù)結(jié)構(gòu)的任何編碼,例如包括XML。事實(shí)上,本公開(kāi)主要討論用XML表示的簡(jiǎn)表,不過(guò)這是為了便于說(shuō)明,而不是對(duì)本發(fā)明的限制。簡(jiǎn)表可利用數(shù)據(jù)結(jié)構(gòu)的任何表示法,C、C++、Java、SGML(標(biāo)準(zhǔn)通用置標(biāo)語(yǔ)言),以及本領(lǐng)域的技術(shù)人員易于想到的其它表示法來(lái)編碼。
圖2的方法還包括通過(guò)適配器(102)在應(yīng)用(105、112)之間傳遞(206)集成消息(208)。在圖2的方法的許多實(shí)施例中,提供(210)適配器簡(jiǎn)表還包括提供包含適配器內(nèi)的傳送器(212)之間的數(shù)據(jù)路線的路由圖(216)的適配器簡(jiǎn)表,根據(jù)路由圖(216)完成應(yīng)用程序之間的傳遞(206)集成消息。在根據(jù)圖2的方法中,構(gòu)成(214)集成適配器還包括創(chuàng)建在適配器簡(jiǎn)表(202)中識(shí)別的傳送器(212),和根據(jù)配置參數(shù)(218)配置(222)傳送器(212)。
簡(jiǎn)表是表示適配器結(jié)構(gòu),并且具有識(shí)別和描述適配器的組件的數(shù)據(jù)元素的數(shù)據(jù)結(jié)構(gòu)。根據(jù)本發(fā)明的適配器使用所述簡(jiǎn)表,根據(jù)在所述簡(jiǎn)表中陳述的其組件的描述,有效地構(gòu)成自身。由于簡(jiǎn)表是數(shù)據(jù)結(jié)構(gòu),因此可按照任何數(shù)據(jù)結(jié)構(gòu)可被實(shí)現(xiàn)的任何方式,用任何編程語(yǔ)言,用任意類型的編碼,用任意類型的文件格式或者數(shù)據(jù)庫(kù)記錄結(jié)構(gòu),實(shí)現(xiàn)簡(jiǎn)表。本公開(kāi)用XML表示簡(jiǎn)表,這不是本發(fā)明的限制,而是因?yàn)閄ML便于讀者理解,簡(jiǎn)表的許多實(shí)現(xiàn),例如呈二進(jìn)制機(jī)器可讀格式的實(shí)現(xiàn)不是那么便于供說(shuō)明之用。另外,在本公開(kāi)中,傾向于以面向?qū)ο蟮男g(shù)語(yǔ),尤其是利用Java和C++來(lái)呈現(xiàn)例子。不過(guò)同樣地,本發(fā)明并不局限于任何特定編程范例或者任何特定編程語(yǔ)言??紤]到這些注意事項(xiàng),下面是簡(jiǎn)表的一個(gè)XML例子
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″order=″1″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr2.java″order=″2″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr2.java″order=″3″>
<configParm>parmValue</configParm>
</transferManager>
</transfermodules>
</adapter>
該例證的XML簡(jiǎn)表識(shí)別兩個(gè)傳送器,一個(gè)名為“inventoryControl”,一個(gè)名為“generalLedger”。每個(gè)傳送器具有一個(gè)接收器和一個(gè)發(fā)送器。每個(gè)接收器和發(fā)送器具有一個(gè)配置參數(shù)。簡(jiǎn)表的許多實(shí)現(xiàn)將識(shí)別和定義兩個(gè)以上的傳送器,發(fā)送器和接收器的許多實(shí)現(xiàn)將具有一個(gè)以上的配置參數(shù)。本例中的數(shù)字是為了說(shuō)明的清楚簡(jiǎn)潔而挑選的,而不是對(duì)本發(fā)明的限制。
例如,就撥號(hào)電話通信協(xié)議的發(fā)送器和接收器來(lái)說(shuō),配置參數(shù)可包括電話號(hào)碼,調(diào)制解調(diào)器速度,注冊(cè)識(shí)別碼,口令等。就HTTP通信協(xié)議的發(fā)送器和接收器來(lái)說(shuō),配置參數(shù)包括一個(gè)或多個(gè)URI。就實(shí)現(xiàn)與JMS的數(shù)據(jù)通信的發(fā)送器和接收器來(lái)說(shuō),配置參數(shù)可包括JMS隊(duì)列的標(biāo)識(shí),隊(duì)列連接,隊(duì)列發(fā)送者,隊(duì)列連接工廠對(duì)象或工廠方法,命名目錄上下文等。就通過(guò)明文TCP/IP實(shí)現(xiàn)數(shù)據(jù)通信的發(fā)送器和接收器來(lái)說(shuō),配置參數(shù)包括網(wǎng)際協(xié)議地址和端口號(hào)。對(duì)于通過(guò)文件系統(tǒng)中的平面文件實(shí)現(xiàn)數(shù)據(jù)通信的發(fā)送器和接收器來(lái)說(shuō),配置參數(shù)包括路徑名和文件名。
該例證的XML簡(jiǎn)表識(shí)別并提供三個(gè)傳送管理器的配置參數(shù)。一個(gè)傳送管理器本質(zhì)上是被允許處理適配器接收或發(fā)送的消息的自含式程序代碼。傳送管理器便于對(duì)消息的任意處理,以便支持高級(jí)路由,轉(zhuǎn)譯,安全,登錄,或者本領(lǐng)域的技術(shù)人員易于想到的消息處理的任意其它功能。傳送管理器和運(yùn)行它們的順序在適配器簡(jiǎn)表中定義。根據(jù)本發(fā)明的適配器一般支持任意數(shù)目的傳送管理器。不存在應(yīng)用于傳送管理器的任何處理限制。任何傳送管理器可以按照任何方式隨意處理傳送給它的任何消息的消息內(nèi)容,包括消息主體和任何報(bào)頭參數(shù)的處理。
更特別地,該例證XML簡(jiǎn)表識(shí)別和提供三個(gè)傳送管理器的配置參數(shù),但是不包含任何明確的路由圖。根據(jù)該例證簡(jiǎn)表建立的適配器把在inventoryControl傳送器中接收的所有消息發(fā)送給所有傳送管理器,隨后發(fā)送給generalLedger傳送器中的發(fā)送器。在這樣的適配器中,在generalLedger傳送器中接收的所有消息被發(fā)送給所有傳送管理器,隨后被發(fā)送給在inventoryControl傳送器中的發(fā)送器。<transferManager>標(biāo)記中的“class”屬性識(shí)別每個(gè)傳送管理器可從中被實(shí)例化的Java類別。<transferManager>標(biāo)記中的“order”屬性識(shí)別消息事件將被傳遞給傳送管理器的順序,以致根據(jù)需要,傳送管理器可被設(shè)計(jì)和編程為相互依賴或者并不相互干擾。
不是所有的傳送管理器都將處理所有消息,盡管在該特定的模型中,所有的消息被傳送給所有的傳送管理器。即,編程為變換公布消息中的記帳項(xiàng)目的數(shù)據(jù)結(jié)構(gòu)的傳送管理器將不對(duì)ACK(確認(rèn)消息)進(jìn)行無(wú)論什么處理。在該模型中,根據(jù)消息事件中的參數(shù)推斷哪些消息將由特定的傳送管理器處理是傳送管理器它們自己的編程的一部分。在已知與圖5h中附圖標(biāo)記(602)圖解說(shuō)明的類似的消息事件對(duì)象的情況下,傳送管理器被編程為根據(jù)目的地ID碼(604),可能還結(jié)合源ID碼(606)或者消息類型代碼(607)推斷從庫(kù)存管理程序行進(jìn)到總分類帳的公布消息是將由特定的傳送管理器處理或者忽略的消息。如果路由結(jié)構(gòu)簡(jiǎn)單,并且只有一種消息行進(jìn)到特定目的地,那么僅僅目的地ID(604)就足夠了。如果特定適配器中的路由備選方案復(fù)雜,并且許多消息類型行進(jìn)到相同目的地,那么傳送管理器可能需要更多的信息來(lái)確定特定的消息是否是它要處理的消息。
簡(jiǎn)表中的路由圖有助于解決這種復(fù)雜性。例如,考慮下述的例證XML簡(jiǎn)表
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″mapID=″route1″order=″1″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr2.java″mapID=″route3″order=″2″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr3.java″mapID=″route3″order=″3″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr4.java″mapID=″route2,route4,
route5″order=″4″>
<configParm>parmValue</configParm>
</transferManager>
</transfermodules>
<routemaps>
<map id=″route1″>
<msgType>post</msgType>
<from>purchasingSystem</from>
<to>generalLedger</to>
</map>
<map id=″route2″>
<msgType>ACK</msgType>
<from>generalLedger</from>
<to>purchasingSystem</to>
</map>
<map id=″route3″>
<msgType>post</msgType>
<from>inventoryControl</from>
<to>generalLedger</to>
<to>purchasingSystem</to>
</map>
<map id=″route4″>
<msgType>ACK</msgType>
<from>generalLedger</from>
<to>inventoryControl</to>
</map>
<map id=″route5″>
<msgType>ACK</msgType>
<from>purchasingSystem</from>
<to>inventoryControl</to>
</map>
</routemaps>
</adapter>
該例證XML簡(jiǎn)表識(shí)別和描述分別名為“inventoryControl”、“generalLedger”和“purchasingSystem”的三個(gè)傳送器。該例證的XML簡(jiǎn)表描述由唯一的序號(hào)1、2、3和4識(shí)別的四個(gè)傳送管理器。傳送管理器元件現(xiàn)有在<transferManager>標(biāo)記中具有新的屬性“mapID”,用于聯(lián)系傳送管理器和路由圖。“mapID”取路由圖識(shí)別碼作為其值。
該例證XML簡(jiǎn)表還描述由識(shí)別碼“route1”、“route2”、“route3”、“route4”和“route5”識(shí)別的五個(gè)路由圖。路由圖“route1”描述從采購(gòu)系統(tǒng)到總分類帳的類型“post”的消息的消息路線。路由圖“route2”定義從總分類帳到采購(gòu)系統(tǒng)的確認(rèn)消息的消息路線。路由圖“route3”定義從庫(kù)存管理程序到總分類帳以及到采購(gòu)系統(tǒng)的公布消息的消息路線。路由圖“route4”定義從總分類帳到庫(kù)存管理程序的庫(kù)存公布確認(rèn)消息的消息路線。路由圖“route5”定義從采購(gòu)系統(tǒng)到庫(kù)存管理程序的庫(kù)存公布確認(rèn)消息的消息路線。
根據(jù)類似于該XML例子的簡(jiǎn)表建立的例證適配器僅僅通過(guò)傳送管理器之一,即由屬性“order=1”識(shí)別的傳送管理器,把公布消息從采購(gòu)系統(tǒng)發(fā)送給總分類帳。在本例中,必須檢查消息事件參數(shù),比如目的地ID、源ID、消息類型等,以便確定將使用哪條路線,從而確定哪個(gè)傳送管理器將處理哪些消息的正是所述適配器。即,在本例中,只有一種消息類型被發(fā)送給具有<transferManager>屬性“order=1”的傳送管理器,從而不需要傳送管理器分析它是否要處理它所接收的消息它僅僅處理它收到的所有消息。
類似地在本例中,所有確認(rèn)消息或者說(shuō)“ACK”被發(fā)送給具有<transferManager>屬性“order=4”的傳送管理器。在這種傳送管理器的一些例證實(shí)施例中,傳送管理器將按照類似的方式處理所有ACK消息。就ACK消息處理隨目的地或源而不同來(lái)說(shuō),傳送管理器要通過(guò)參考傳送給它的每個(gè)消息事件中的目的地ID(圖5h上的604)或源ID(606)完成該確定。同樣在本例中,根據(jù)出自適配器簡(jiǎn)表的路由圖,是否處理某一消息的確定被從傳送管理器移出,并被放入適配器自己的程序設(shè)計(jì)中。
在該例證的XML簡(jiǎn)表中,從庫(kù)存管理程序到總分類帳以及到采購(gòu)系統(tǒng)的公布消息的處理也是指導(dǎo)性的。路由圖“route3”定義從庫(kù)存管理程序到總分類帳以及到采購(gòu)系統(tǒng)的消息路線。在該簡(jiǎn)表中,兩個(gè)傳送管理器被描述成在“route3”上,即具有<transferManager>屬性“order=2”的傳送管理器和具有<transferManager>屬性“order=3”的傳送管理器。在本例中,總分類帳和采購(gòu)系統(tǒng)出自不同的軟件開(kāi)發(fā)人員,并對(duì)帳戶公布使用完全不同的數(shù)據(jù)結(jié)構(gòu)。假定具有<transferManager>屬性“order=2”的傳送管理器把來(lái)自庫(kù)存管理結(jié)構(gòu)的輸入消息的數(shù)據(jù)結(jié)構(gòu)變換成總分類帳結(jié)構(gòu),具有<transferManager>屬性“order=3”的傳送管理器把來(lái)自庫(kù)存管理結(jié)構(gòu)的輸入消息的數(shù)據(jù)結(jié)構(gòu)變換成采購(gòu)系統(tǒng)結(jié)構(gòu)。本例中的適配器產(chǎn)生來(lái)自庫(kù)存管理傳送器的輸入公布消息事件的副本,把原件發(fā)送給具有<transferManager>屬性“order=2”的傳送管理器,并把副本發(fā)送給具有<transferManager>屬性“order=3”的傳送管理器。根據(jù)對(duì)具有<transferManager>屬性“order=2”的傳送管理器的調(diào)用的返回,適配器把現(xiàn)在為供總分類帳之用而構(gòu)成的原始消息事件轉(zhuǎn)發(fā)給用于總分類帳的傳送器中的發(fā)送器。根據(jù)對(duì)具有<transferManager>屬性“order=3”的傳送管理器的調(diào)用的返回,適配器把現(xiàn)在為供采購(gòu)系統(tǒng)之用而構(gòu)成的消息事件的副本轉(zhuǎn)發(fā)給用于采購(gòu)系統(tǒng)的傳送器中的發(fā)送器。在本例的所有情況中,接收消息的傳送管理器僅僅處理所述消息,而不決定是否處理消息。根據(jù)消息事件本身中的目的地、源和類型信息(例如圖5h上的附圖標(biāo)記604、606、607),決定哪個(gè)傳送管理器將處理哪些消息的處理負(fù)擔(dān)被有效地轉(zhuǎn)移給適配器對(duì)象本身。
在一些實(shí)施例中,傳送管理器在通過(guò)適配器的一條以上的路線上被調(diào)用。不是通過(guò)在傳送模塊元件中使用傳送管理器的多個(gè)項(xiàng)目(entry)來(lái)實(shí)現(xiàn)多個(gè)路由(就我們的XML例子來(lái)說(shuō)),在備選的例證實(shí)施例中,有利的是直接在路由圖描述中列舉傳送管理器,如下面的例子所示
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiver>
<configParm>parmValue</configParm>
</receiver>
<sender>
<configParm>parmValue</configParm>
</sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″id=″xfrMgrName1″order=″1″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr2.java″id=″xfrMgrName2″order=″2″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr3.java″id=″xfrMgrName3″order=″3″>
<configParm>parmValue</configParm>
</transferManager>
<transferManager class=″xfrMgr4.java″id=″xfrMgrName4″order=″4″>
<configParm>parmValue</configParm>
</transferManager>
</transfermodules>
<routemaps>
<map id=″route1″>
<msgType>post</msgType>
<from>purchasingSystem</from>
<to>generalLedger</to>
<transferManager>xfrMgrName1</transferManager>
</map>
<map id=″route2″>
<msgType>ACK</msgType>
<from>generalLedger</from>
<to>purchasingSystem</to>
<transferManager>xfrMgrName4</transferManager>
</map>
<map id=″route3″>
<msgType>post</msgType>
<from>inventoryControl</from>
<to>generalLedger</to>
<to>purchasingSystem</to>
<transferManager>xfrMgrName2</transferManager>
<transferManager>xfrMgrName3</transferManager>
</map>
<map id=″route4″>
<msgType>ACK</msgType>
<from>generalLedger</from>
<to>inventoryControl</to>
<transferManager>xfrMgrName4</transferManager>
</map>
<map id=″route5″>
<msgType>ACK</msgType>
<from>purchasingSystem</from>
<to>inventoryControl</to>
<transferManager>xfrMgrName4</transferManager>
</map>
</routemaps>
</adapter>
該例證簡(jiǎn)表實(shí)現(xiàn)發(fā)送器和接收器之間與前面的例證簡(jiǎn)表所實(shí)現(xiàn)的完全相同的路線。即,路由圖“route1”描述從采購(gòu)系統(tǒng)到總分類帳的類型“post”的消息的消息路線,包括通過(guò)第一個(gè)列舉的傳送管理器(這里用其識(shí)別名“xfrMgr1”識(shí)別)的路由。路由圖“route2”定義從總分類帳到采購(gòu)系統(tǒng)的確認(rèn)消息的消息路線,包括通過(guò)第二個(gè)列舉的傳送管理器(這里用其識(shí)別名“xfrMgr2”識(shí)別)的路由。對(duì)于剩余的三個(gè)路由圖依次類推。但是和第一例子不同,在本例中,傳送管理器中的路線標(biāo)識(shí)符,mapID=“route1”、mapID=“route2”等被除去,通過(guò)以<transferManager>xfrMgrName1</transferManager><transferManager>xfrMgrName2</transferManager>等的形式,直接把傳送管理器的名稱放入圖目的地中,使傳送管理器與圖路線相聯(lián)系。第四個(gè)傳送管理器(名為“xfrMgr4”的傳送管理器)在經(jīng)過(guò)適配器的三條路線上被調(diào)用,所述三條路線被識(shí)別為“route2”、“route4”和“route5”。
創(chuàng)建(220)在適配器簡(jiǎn)表(202)中識(shí)別的傳送器(212)和根據(jù)配置參數(shù)(218)配置(222)傳送器(212)在根據(jù)本發(fā)明的實(shí)施例的許多適配器中進(jìn)行,如圖5和5a-5h中陳述的例證類別結(jié)構(gòu)所示。圖5圖解說(shuō)明根據(jù)本發(fā)明的實(shí)施例,由其構(gòu)成適配器的例證類別之間的關(guān)系。
如同當(dāng)適配器被描述成“包含”或“包括”傳送器、發(fā)送器、接收器或者傳送管理器時(shí)一樣,在本公開(kāi)中,軟件模塊常被描述成“包含”其它軟件模塊。有益的是注意在本公開(kāi)中經(jīng)常用于描述本發(fā)明的各個(gè)例證實(shí)施例的面向?qū)ο蟮姆独校粋€(gè)模塊包含或包括另一模塊通常意味著第一模塊擁有對(duì)第二模塊的引用(reference)或者指針,如同傳送器“具有一個(gè)”接收器,意味著所述傳送器在其成員數(shù)據(jù)元素中保持有對(duì)接收器對(duì)象的引用一樣。在C++中,更常見(jiàn)的是把引用管理為對(duì)象的指針,不過(guò)在本公開(kāi)中,為了清楚和簡(jiǎn)潔起見(jiàn),通過(guò)用引用來(lái)描述這樣的關(guān)系。圖5中的箭頭一般指示面向?qū)ο蟮摹癶as a”關(guān)系,即,哪一類別一般擁有對(duì)其它類別的引用。
根據(jù)圖5的例子的適配器(102)具有對(duì)簡(jiǎn)表(202)的引用,不過(guò)實(shí)際上,簡(jiǎn)表(202)常常根本不是一個(gè)類別對(duì)象,而是文件系統(tǒng)中的一個(gè)文件。當(dāng)然,文件系統(tǒng)中的數(shù)據(jù)的管理大大慢于計(jì)算機(jī)存儲(chǔ)器中的數(shù)據(jù)的管理,從而根據(jù)本發(fā)明的實(shí)施例的多數(shù)適配器(102)于是把簡(jiǎn)表(102)解析成更便于在運(yùn)行的軟件系統(tǒng)內(nèi)引用的內(nèi)部類別對(duì)象,這里圖解表示成解析的簡(jiǎn)表類別(502)。適配器(102)例示在簡(jiǎn)表(202)中識(shí)別的傳送器(212)和傳送管理器(406)。在本例中,傳送器(212)例示接收器(312)和發(fā)送器(316),并把對(duì)它們的引用返回給適配器,以致適配器也擁有對(duì)接收器類別(312)和發(fā)送器類別(316)的引用。適配器使用它自己的對(duì)接收器的引用來(lái)向接收器(312)登記事件監(jiān)聽(tīng)器(536)在圖5中,事件監(jiān)聽(tīng)器(536)被表示成獨(dú)立的類別,不過(guò)實(shí)際上,許多適配器將把適配器自身登記為事件監(jiān)聽(tīng)器。當(dāng)接收器(312)收到消息時(shí),接收器把該消息封裝在消息事件(504)中,并通過(guò)事件監(jiān)聽(tīng)器把對(duì)所述消息事件的引用傳回適配器(102),或者直接傳回適配器(如果適配器是事件監(jiān)聽(tīng)器的話)。適配器把消息事件對(duì)象,或者實(shí)際上對(duì)消息事件對(duì)象的引用傳遞給傳送管理器(406),隨后傳送給發(fā)送器(504),以便處理所述消息,隨后把所述消息發(fā)送給其目的地。從而,傳送管理器類別(406),接收器(312),發(fā)送器(316)和適配器(102)都獲得對(duì)消息事件類別(504)的引用。
再次參考圖2,并就圖5和5a-5h的類別圖表來(lái)說(shuō),在許多例子中,構(gòu)成(204)應(yīng)用集成適配器(這里根據(jù)包含描述適配器的數(shù)據(jù)的簡(jiǎn)表(202)進(jìn)行所述構(gòu)成)由具有與下述例子類似的形式的命令行接口輸入啟動(dòng)
Java com.adapters.Adapter<ProfileName>
該例證的命令指令Java虛擬機(jī)裝入并例示適配器名稱Adapter,并運(yùn)行其名為“main()”(圖5a上的附圖標(biāo)記520)的成員方法。在本公開(kāi)中,除非另有說(shuō)明,適配器對(duì)象執(zhí)行的動(dòng)作或處理步驟的描述一般是在圖5a的附圖標(biāo)記(102)圖解說(shuō)明的那種適配器對(duì)象中的main()成員方法的操作的描述。在本例中,main(),或者適配器可選地,不過(guò)一般通過(guò)打開(kāi)名為“ProfileName”的文件中的簡(jiǎn)表,并將其以和在圖5b的附圖標(biāo)記(502)圖解說(shuō)明的類似的數(shù)據(jù)結(jié)構(gòu)解析到內(nèi)部存儲(chǔ)器中來(lái)繼續(xù)進(jìn)行。圖5b的解析的簡(jiǎn)表類別提供傳送管理器的列表(542),包括其配置參數(shù)的傳送器的列表(544),和路由圖的列表(555)的解析存儲(chǔ)。除了所述列表提供的結(jié)構(gòu)化存儲(chǔ)器之外,圖5b的解析的簡(jiǎn)表類別還提供用于增加所述列表的成員方法(546、544、555),和當(dāng)其它協(xié)作對(duì)象需要列表時(shí),取回列表的成員方法(550、552、553)。
圖5b中,傳送管理器的列表(542),包括其配置參數(shù)的傳送器的列表(544),和路由圖的列表(555)都被描述成具有數(shù)據(jù)類型“List”。數(shù)據(jù)類型的這種描述不是限制性的。本領(lǐng)域的技術(shù)人員易于想到,各種數(shù)據(jù)類型可被用于這樣的數(shù)據(jù)結(jié)構(gòu),用于在本公開(kāi)中討論的所有數(shù)據(jù)結(jié)構(gòu),例如包括向量、數(shù)組表、集合、容器等。
在根據(jù)圖2的方法中,構(gòu)成(214)集成適配器還包括創(chuàng)建(220)在適配器簡(jiǎn)表(202)中識(shí)別的傳送器(212),并根據(jù)配置參數(shù)(218)配置(222)所述傳送器(212)。在本例中,Adapter.main()通過(guò)例示在解析的簡(jiǎn)表(502)中的傳送器列表(544)中列舉的每個(gè)傳送器,創(chuàng)建傳送器。根據(jù)配置參數(shù)(218)配置(222)傳送器(212)一般包含創(chuàng)建每個(gè)傳送器的接收器和發(fā)送器,并用配置參數(shù)配置所述接收器和發(fā)送器。
圖3是圖解說(shuō)明創(chuàng)建根據(jù)本發(fā)明的應(yīng)用集成適配器的傳送器的接收器和發(fā)送器的方法的數(shù)據(jù)流程圖。在根據(jù)圖3的方法實(shí)現(xiàn)的許多適配器中,每個(gè)傳送器包含用于創(chuàng)建接收器的參數(shù)化工廠方法(圖5c上的556)。在這樣的實(shí)施例中,配置(222)所述傳送器包括創(chuàng)建(306)每個(gè)傳送器的一個(gè)接收器,由對(duì)利用至少一些配置參數(shù)創(chuàng)建接收器的參數(shù)化工廠方法(圖5c上的556)的調(diào)用來(lái)實(shí)現(xiàn)。在根據(jù)圖3的方法中,每個(gè)傳送器一般包括創(chuàng)建一個(gè)發(fā)送器的工廠方法(圖5c上的558),配置(222)傳送器(212)還包括創(chuàng)建(318)每個(gè)傳送器(212)的一個(gè)發(fā)送器(316)。
下面是工廠方法的一個(gè)說(shuō)明性偽代碼例子
////Transport Class////Illustrating a parameterized factory method for creatingreceiver objects//class TransportClass{public static Receiver createReceiver(ConfigParm1,ConfigParm2,and so on…){if(ConfigParm1==HTTP &&ConfigParm2==INVENTORYCONTROL)receiverID=″receiver1″;elseif(ConfigParm1==IIOP &&<!-- SIPO <DP n="30"> --><dp n="d30"/>ConfigParm2==INVENTORYCONTROL) receiverID=″receiver2″; elseif(ConfigParm1==HTTP&&ConfigParm2==GENERALLEDGER) receiverID=″receiver3″; elseif(ConfigParm1==JMS &&ConfigParm2==GENERALLEDGER) receiverID=″receiver4″; elseif(ConfigParm1==HTTP&&ConfigParm2==PURCHASINGSYSTEM) receiverID=″receiver5″; elseif(ConfigParm1==IIOP&&ConfigParm2==PURCHASINGSYSTEM) receiverID=″receiver6″; Receiver aReceiver=null;//empty reference for new receiverobject switch(receiverID) { case″receiver1″aReceiver=new receiver1.class;break; case″receiver2″aReceiver=new receiver2.class;break; …… case″receiverN-1″aReceiver=new receiver5.class;break; case″receiverN″aReceiver=new receiver6.class;break; }//end switch() return aReceiver; }//end createReceiver() public static Sender createSender(ConfigParm1,ConfigParm2,and so on…) {<!-- SIPO <DP n="31"> --><dp n="d31"/> //Exemplary Transport classes also support factory methodsfor senders //similar to the one for receivers set forth just above,createReceiver().} }//end class TransportClass
在該偽代碼例子中,creatReceiver()是參數(shù)化工廠方法。creatReceiver()由例如Adapter.main()調(diào)用,一組配置參數(shù)和為所述調(diào)用的參數(shù)。creatReceiver()可被過(guò)載并利用由工廠方法creatReceiver()中支持的任何接收器類別所支持的配置參數(shù)的任意組合調(diào)用。creatReceiver()可支持任意數(shù)目的具體接收器類別。creatReceiver()通過(guò)根據(jù)配置參數(shù),經(jīng)過(guò)一系列的IF語(yǔ)句選擇接收器標(biāo)識(shí)起作用。creatReceiver()隨后根據(jù)接收器標(biāo)識(shí)運(yùn)行switch()語(yǔ)句,以便選擇具體的接收器類別,并根據(jù)其例示新的接收器對(duì)象。
在本例中,名為“Receiver”的類別是所有其它接收器類別可繼承的抽象類別,從而使creatReceiver()能夠返回類型“Receiver”的引用,該引用事實(shí)上是對(duì)任何接收器類別對(duì)象的引用。于是,從適配器中的協(xié)作對(duì)象對(duì)接收器對(duì)象的調(diào)用可以是多形態(tài)的。這樣,傳送器,適配器本身,以及包含在適配器內(nèi)的任何協(xié)作對(duì)象或軟件模塊既不知道或關(guān)心哪些應(yīng)用程序正被集成,又不知道或關(guān)心哪些通信協(xié)議被用于集成這些應(yīng)用程序。適配器內(nèi)的對(duì)象之中的所有協(xié)作相對(duì)于應(yīng)用實(shí)體和通信協(xié)議,被完全中立、透明和模塊化地實(shí)施。
圖3中圖解說(shuō)明的方法包括向每個(gè)接收器登記(310)一個(gè)傳送器事件監(jiān)聽(tīng)器。在根據(jù)圖3的方法創(chuàng)建接收器的一些適配器中,集成適配器(102)本身包含傳送器事件監(jiān)聽(tīng)器(314)。即,在一些實(shí)施例中,通過(guò)把適配器本身登記為事件監(jiān)聽(tīng)器完成向每個(gè)接收器登記(310)傳送器事件監(jiān)聽(tīng)器。在這樣的實(shí)施例中,適配器本身將包含用于接收器的要求轉(zhuǎn)交(hand off)輸入消息的成員方法,例如在圖5a的例證適配器類別(102)中的附圖標(biāo)記(532)所示的transportEvent()方法。在事件監(jiān)聽(tīng)器(314)是與適配器本身分離的對(duì)象的實(shí)施例中,構(gòu)造器首先通過(guò)例示事件監(jiān)聽(tīng)器類別的獨(dú)立對(duì)象,例如在圖5a的附圖標(biāo)記(536)圖解說(shuō)明的獨(dú)立對(duì)象,創(chuàng)建(308)傳送器事件監(jiān)聽(tīng)器(314)。
圖4是圖解說(shuō)明創(chuàng)建傳送管理器的例證方法的數(shù)據(jù)流程圖。在圖4的方法中,提供(210)適配器簡(jiǎn)表(202)包括提供包含一個(gè)或多個(gè)數(shù)據(jù)傳送管理器(406)的標(biāo)識(shí)(402),包括數(shù)據(jù)傳送管理器的配置參數(shù)(404)的適配器簡(jiǎn)表。圖4的方法包括構(gòu)成(204)應(yīng)用集成適配器(102),構(gòu)成(204)應(yīng)用集成適配器(102)又包括創(chuàng)建(408)在簡(jiǎn)表(202)中識(shí)別(402)的傳送管理器(406),和根據(jù)配置參數(shù)(404)配置(410)傳送管理器(406)。
就圖5a的例證數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō),適配器(102)包含用于創(chuàng)建傳送管理器的名為createTransferManagers()(530)的工廠方法。在本例中,解析的簡(jiǎn)表類別(502)中的傳送管理器列表(542)包含在所述簡(jiǎn)表中定義的所有傳送管理器的定義,以及每個(gè)傳送管理器的配置參數(shù)。構(gòu)成這樣的例證適配器包括利用傳送管理器的配置參數(shù)為傳送管理器列表(542)中的每個(gè)傳送管理器調(diào)用一次用于傳送管理器的工廠方法,作為響應(yīng)接收對(duì)新的傳送管理器的引用。對(duì)新的傳送管理器的引用連同它們的屬性,比如路由圖標(biāo)識(shí)符和調(diào)用序號(hào)隨后被保存在適配器(102)的傳送管理器列表(514)中,供適配器在路由消息中使用。
圖6是圖解說(shuō)明構(gòu)成應(yīng)用集成適配器的方法的調(diào)用序列圖。更具體地說(shuō),圖6描述了構(gòu)成根據(jù)本發(fā)明的例證實(shí)施例的適配器的協(xié)作對(duì)象中的成員方法之間的例證調(diào)用序列。當(dāng)以類似于下述的命令行輸入例示適配器時(shí),開(kāi)始圖6的序列
Java com.adapter.Adapter<ProfileName>
適配器中的成員方法,或者其構(gòu)造器或者其main()方法通過(guò)調(diào)用(622)解析的簡(jiǎn)表(圖5b上的502)中的增加方法(圖5b546、548、549),解析識(shí)別為<ProfileName>的簡(jiǎn)表。增加方法把傳送管理器(542),傳送器(544)和任意路由圖(555)的描述插入解析的簡(jiǎn)表的成員數(shù)據(jù)元素中。
適配器(102)構(gòu)成(624)在解析的傳送器列表(圖5b上的544)中描述的每個(gè)傳送器。適配器調(diào)用構(gòu)成的每個(gè)傳送器中的creatReceiver()(626),每個(gè)creatReceiver()調(diào)用導(dǎo)致傳送器的接收器的構(gòu)成(628)。每個(gè)creatReceiver()調(diào)用(626)向適配器返回對(duì)創(chuàng)建的接收器的引用。適配器把對(duì)每個(gè)接收器的引用保存在適配器中的接收器列表(圖5a中的516)中,特別供配置接收器和登記事件監(jiān)聽(tīng)器之用。適配器調(diào)用構(gòu)成的每個(gè)傳送器中的creatSender()(630),每個(gè)creatSender()調(diào)用導(dǎo)致傳送器的發(fā)送器的構(gòu)成(632)。每個(gè)creatSender()調(diào)用(630)向適配器返回創(chuàng)建的發(fā)送器的引用。適配器把對(duì)每個(gè)發(fā)送器的引用保存在適配器中的發(fā)送器列表(圖5a上的518)中,供配置發(fā)送器之用和在路由消息中使用。
適配器調(diào)用(634)每個(gè)接收器(312)中的configure()方法(圖5d上的566),傳遞接收器配置參數(shù)作為調(diào)用參數(shù),從而每個(gè)接收器能夠自我配置。借助對(duì)諸如addEventListener()(圖5d上的570)之類方法的調(diào)用(636),在其接收器列表中的每個(gè)接收器中,適配器把它自己或者另一對(duì)象登記為事件監(jiān)聽(tīng)器。適配器調(diào)用(638)每個(gè)發(fā)送器(316)中的configure()方法(圖5e上的584),傳遞發(fā)送器配置參數(shù)作為調(diào)用參數(shù),從而每個(gè)發(fā)送器能夠自我配置。
適配器構(gòu)成(640)在簡(jiǎn)表中識(shí)別的或者在解析的簡(jiǎn)表(圖5b上的502)中的傳送器管理器列表(圖5b上的542)中識(shí)別的每個(gè)傳送管理器(120)。為了在路由消息中使用,適配器把對(duì)每個(gè)傳送管理器的引用保持在適配器(102)中的傳送管理器列表(圖5a上的514)中。
適配器調(diào)用(641)每個(gè)接收器中的run()方法(圖5d上的574),建議每個(gè)接收器根據(jù)接收器使用的協(xié)議開(kāi)始數(shù)據(jù)通信操作。在本發(fā)明的典型實(shí)施例中,一個(gè)以上的接收器必須同時(shí)運(yùn)行,從而有利的是,對(duì)run()方法(574)的調(diào)用是觸發(fā)執(zhí)行的新的并行進(jìn)程或線程,并把控制迅速返回給調(diào)用者的非分塊調(diào)用。更特別地,例如就Java來(lái)說(shuō),有利的是,在這樣的例證實(shí)施例中的接收器類別被定義為從“線程”類別繼承其start()接口方法。從而在這樣的實(shí)施例中,對(duì)run()方法的調(diào)用被實(shí)現(xiàn)成對(duì)SomeReceiverClass.start()的調(diào)用,SomeReceiverClass.start()再在獨(dú)立的執(zhí)行線程中執(zhí)行run()方法,并迅速返回給調(diào)用者。下面是一個(gè)例子
class HTTPReceiver extends Thread{
private Port ListenPort=80;
public void run(){
//control code to operate
//a receiver over the HTTP protocol
//for data communication from
//a particular software application
}
}
該例子宣布HTTPReceiver為線程的子類別,并超越出自線程類別的run()方法,在目前的Java中眾所周知。下面的例證Java代碼從而能夠創(chuàng)建一個(gè)獨(dú)立的執(zhí)行線程并開(kāi)始其運(yùn)行
HTTPReceiver aReceiver=new HTTPReceiver();
aReceiver.start();
這舉例說(shuō)明了把接收器的run()方法實(shí)現(xiàn)成一個(gè)獨(dú)立的執(zhí)行線程的一種特定方法,這只是用于舉例說(shuō)明,而不是對(duì)本發(fā)明的限制。本領(lǐng)域的技術(shù)人員易于想到,為接收器啟動(dòng)獨(dú)立的執(zhí)行線程的方式有多種,所有這些方式都在本發(fā)明的范圍之內(nèi)。不過(guò)一般來(lái)說(shuō),適配器例示并激活通過(guò)使用例如事件監(jiān)聽(tīng)器,與適配器異步工作(如本公開(kāi)中下面更詳細(xì)所述)的任意數(shù)目的接收器的方式都是這樣。
但是,把接收器的run()方法異步地實(shí)現(xiàn)成并行的獨(dú)立執(zhí)行線程不是對(duì)本發(fā)明的所有實(shí)施例的一般限制。根據(jù)本發(fā)明的實(shí)施例的一些適配器事實(shí)上并不把接收器的run()方法異步地實(shí)現(xiàn)成并行的獨(dú)立執(zhí)行線程。根據(jù)本發(fā)明的實(shí)施例的一些適配器利用分塊調(diào)用順序輪詢接收器的run()方法。在這樣的實(shí)施例中,例如,適配器的main()方法通過(guò)對(duì)接收器的run()方法的分塊調(diào)用,依次輪詢每個(gè)接收器。調(diào)用方法的執(zhí)行暫停,直到對(duì)run()方法的調(diào)用返回為止。一般在這樣的實(shí)施例中,接收器的run()方法檢查輸入消息,根據(jù)需要轉(zhuǎn)譯任何輸入消息的編碼格式,把輸入消息封裝在消息事件對(duì)象中,并把對(duì)這樣創(chuàng)建的任何消息事件對(duì)象的引用返回給調(diào)用適配器。隨后,適配器調(diào)用其中接收器列表上的下一接收器。在這樣的實(shí)施例中,可選并且有利的是,事件監(jiān)聽(tīng)器可不被使用-或者可和在異步實(shí)施例中相比,不太頻繁地被使用。
在這一處理時(shí)刻,例證的適配器中的已用其配置參數(shù)配置自己,并且按照它們的協(xié)議開(kāi)始數(shù)據(jù)通信操作的接收器正在根據(jù)它們的協(xié)議工作,準(zhǔn)備接收消息,把消息放入消息事件中,并把消息事件轉(zhuǎn)移給事件監(jiān)聽(tīng)器以便通過(guò)適配器處理。即,此時(shí),適配器被構(gòu)成并且正在運(yùn)行。
圖7是描述通過(guò)適配器(102)在應(yīng)用程序(106、116)中傳遞(圖2上的206)集成消息(208)的例證方法的數(shù)據(jù)流程圖。圖7的方法包括從源應(yīng)用(106)接收(702)具有源消息格式(712)和源數(shù)據(jù)結(jié)構(gòu)(714)的集成消息(208)。就圖5a-5h的例證類別結(jié)構(gòu)來(lái)說(shuō),出于說(shuō)明的目的,假定適配器的每個(gè)接收器中的run()方法正在根據(jù)在每個(gè)接收器的配置參數(shù)中識(shí)別的數(shù)據(jù)通信協(xié)議進(jìn)行數(shù)據(jù)通信。
圖7的方法包括把集成消息(208)從源消息格式(712)轉(zhuǎn)換(708)成對(duì)目的應(yīng)用(116)有用的目的地消息格式(720)。就圖5d的例證類別結(jié)構(gòu)來(lái)說(shuō),通過(guò)從run()方法(574)對(duì)接收器類別(560)中的轉(zhuǎn)譯方法(575)的調(diào)用,執(zhí)行轉(zhuǎn)譯(708)。轉(zhuǎn)譯方法(575)的工作是轉(zhuǎn)換消息的格式,而不是轉(zhuǎn)換消息的數(shù)據(jù)結(jié)構(gòu)。即,轉(zhuǎn)譯方法轉(zhuǎn)換消息的整體形式,保留內(nèi)部數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)元素名稱、類型和值不變。如果需要,轉(zhuǎn)換內(nèi)部數(shù)據(jù)結(jié)構(gòu)是傳送管理器中的變換方法的工作,而不是接收器或其轉(zhuǎn)譯方法的工作。格式轉(zhuǎn)譯的例子包括從字符串化的(stringified)Java轉(zhuǎn)換到XML,從二進(jìn)制C++數(shù)據(jù)格式轉(zhuǎn)換到XML等等。格式轉(zhuǎn)譯的一個(gè)特定例子是編程為把下述C結(jié)構(gòu)
struct address
{
char *name=″John Smith″;
char *address=″100 Main Street″
char *city=″Smallville″;
char *state=″Iowa″;
char *zip=″10101″;
}
轉(zhuǎn)換成下述XML結(jié)構(gòu)的接收器
<address>
<name>John Smith</name>
<address>100 Main Street</address>
<city>Smallville</city>
<state>Iowa</state>
<zip>10101</zip>
</address>.
這樣的接收器通過(guò)讀取每個(gè)C數(shù)據(jù)元素和創(chuàng)建具有相同名稱、類型和值的對(duì)應(yīng)XML元素繼續(xù)進(jìn)行。該C結(jié)構(gòu)可以編譯的形式,即編碼的二進(jìn)制形式被傳送,或者以正如上面所示的未編譯文本的形式被傳送。到XML的變換保留數(shù)據(jù)中的所有結(jié)構(gòu),數(shù)據(jù)元素的名稱、類型和值,只把格式從C變成XML。
實(shí)際上,為了支持適配器內(nèi)的異步操作,實(shí)現(xiàn)圖7的方法的適配器一般還包括把集成消息封裝(704)在消息事件(716)中,并把該消息事件(716),或者對(duì)所述消息事件的引用傳送(706)給至少一個(gè)事件監(jiān)聽(tīng)器。在圖5h的附圖標(biāo)記(602)圖解說(shuō)明了消息事件的一個(gè)例證結(jié)構(gòu)。消息事件類別(602)只包含一個(gè)成員方法,一個(gè)其唯一的作用是把消息參數(shù)記錄在消息事件對(duì)象中,并把對(duì)消息事件的引用返回給調(diào)用接收器的構(gòu)造器(616)。消息事件參數(shù)包括這里表示為數(shù)據(jù)類型“字符串化”(不過(guò)本領(lǐng)域的技術(shù)人員易于想到任何有用的數(shù)據(jù)類型)的其目的地(604),其源(606),其消息類型(607),消息識(shí)別碼(608),安全標(biāo)記(610),狀態(tài)碼(612),和有用地,消息本身的主體(614)。
在例證的類別結(jié)構(gòu)中,通過(guò)從接收器到事件監(jiān)聽(tīng)器(536)中的transportEvent()方法(圖5a上的532),進(jìn)行把消息事件(706)傳遞給事件監(jiān)聽(tīng)器。transportEvent()方法(532)被表示在圖5a上的適配器類別(102)中,另外提示一下,可選的是,適配器把自身登記為事件監(jiān)聽(tīng)器。從而,使消息事件在任何傳送管理器中被傳播,并且最終被傳播到發(fā)送器對(duì)象中的send()方法的一般正是事件監(jiān)聽(tīng)器(或者它自己,或者通過(guò)其它協(xié)作對(duì)象)。在典型的實(shí)施例中,發(fā)送(710)包括從消息事件中取出集成消息,并重新將其封裝到目的地傳送器(144)的send()方法(圖5e上的592)所使用的數(shù)據(jù)通信協(xié)議所需的消息結(jié)構(gòu)中。
圖7的方法還包括把集成消息發(fā)送(710)給目的應(yīng)用(116),在例證的類別結(jié)構(gòu)中,通過(guò)對(duì)發(fā)送器對(duì)象(576)中的send()方法(圖5e上的592)的調(diào)用來(lái)實(shí)現(xiàn)。更具體地說(shuō),圖7的方法不包括任何數(shù)據(jù)結(jié)構(gòu)變換和到目的格式的任何轉(zhuǎn)譯。這意味著在源應(yīng)用程序和目的應(yīng)用程序能夠利用相同的數(shù)據(jù)結(jié)構(gòu)工作,但是源應(yīng)用程序輸出呈二進(jìn)制形式,字符串化Java,C++結(jié)構(gòu),或者除XML之外的任何形式的數(shù)據(jù)結(jié)構(gòu),并且目的應(yīng)用程序要求以XML形式輸入它們的情況下,圖7的方法是有用的。
圖8是描述通過(guò)適配器(102)在應(yīng)用(106、116)之間傳遞(圖2上的206)集成消息(208)的另一例證方法的數(shù)據(jù)流程圖。圖8的方法包括從源應(yīng)用(106)接收具有源消息格式(712)和源數(shù)據(jù)結(jié)構(gòu)(714)的集成消息(208)。圖8的方法還包括把集成消息(208)從源消息格式(712)轉(zhuǎn)譯(802)成可用于適配器內(nèi)的內(nèi)部處理的中間消息格式(804),所述內(nèi)部處理包括數(shù)據(jù)變換和安全處理,還包括本領(lǐng)域的技術(shù)人員易于想到的其它處理方式。
圖8的方法還包括把集成消息(208)從源數(shù)據(jù)格式(714)變換成目的地?cái)?shù)據(jù)結(jié)構(gòu)(808)。在數(shù)據(jù)變換中,與數(shù)據(jù)轉(zhuǎn)譯不同,數(shù)據(jù)結(jié)構(gòu)被變更,象當(dāng)來(lái)自源應(yīng)用程序的下述結(jié)構(gòu)
<address>
<lastName>Smith</lastName>
<firstName>John</firstName>
<addressLine1>100 Main Street</addressLine1>
<addressLine2>Suite5</addressLine2>
<city>Smallville</city>
<state>Iowa</state>
<mailCode>10101</mailCode>
</address>
被轉(zhuǎn)譯成目的應(yīng)用程序所需的下述結(jié)構(gòu)時(shí)
<address>
<name>John Smith</name>
<address>100 Main Street,Suite5</address>
<city>Smallville</city>
<state>Iowa</state>
<zip>10101</zip>
</address>
對(duì)于這兩種結(jié)構(gòu)來(lái)說(shuō),數(shù)據(jù)格式是相同的,即用于轉(zhuǎn)譯的中間格式(在本例中為XML)。但是,在其數(shù)據(jù)元素名稱和值方面,數(shù)據(jù)結(jié)構(gòu)本身被改變。
在圖8的方法的許多例證實(shí)施例中,通過(guò)傳送管理器執(zhí)行變換(806)。繼續(xù)以XML作為用于數(shù)據(jù)轉(zhuǎn)譯的中間數(shù)據(jù)格式的說(shuō)明性例子就例證的類別結(jié)構(gòu)來(lái)說(shuō),通過(guò)經(jīng)由對(duì)成員方法,比如process()(圖5g上的609)的調(diào)用,把messageEvent對(duì)象,比如在圖5h的附圖標(biāo)記(602)圖解說(shuō)明的攜帶消息結(jié)構(gòu)(614)以及傳送管理器執(zhí)行轉(zhuǎn)譯所需的處理參數(shù)的messageEvent對(duì)象傳遞給傳送管理器(圖5g上的619),把集成消息(208)從源數(shù)據(jù)結(jié)構(gòu)(714)變換(806)成目的地?cái)?shù)據(jù)結(jié)構(gòu)(808)。
在本例中,process(messageEvent)方法(609)使用出自消息事件(602)的源標(biāo)識(shí)(606)和目的地標(biāo)識(shí)(604)根據(jù)為此目的保存在傳送管理器(619)中的數(shù)組表(615)推斷XSLT樣式表的文件名。process()方法609通過(guò)調(diào)用XSL處理器(未示出),傳送樣式表的名稱和輸入的XML作為調(diào)用參數(shù),繼續(xù)進(jìn)行處理。XSL處理器讀取輸入的XML,并遵循XSL樣式表中的指令;隨后它把轉(zhuǎn)譯的XML作為其回答輸出給process()方法。許多XML處理器易于從各個(gè)制造商現(xiàn)貨獲得,例如包括可從Apache Software Foundation獲得的公知的“Xalan”XSLT處理器。
圖8的方法包括把集成消息發(fā)送(710)給目的應(yīng)用(116)。圖8圖解說(shuō)明了發(fā)送集成消息的兩種例證執(zhí)行路徑。圖8公開(kāi)了直接發(fā)送(710)消息,而不存在附加的轉(zhuǎn)譯的備選方案(806、208、710)。特別是,當(dāng)用于變換消息的數(shù)據(jù)結(jié)構(gòu)的中間消息格式(804)與目的應(yīng)用程序預(yù)期的格式相同時(shí),所述備選方案有用。即,例如,當(dāng)中間格式(804)是XML,并且目的應(yīng)用能夠接收和使用XML的集成消息時(shí),無(wú)附加轉(zhuǎn)譯的發(fā)送是有用的。
圖8還公開(kāi)了把集成消息(208)從中間消息格式(804)轉(zhuǎn)譯(810)成目的應(yīng)用(116)可用的目的消息格式(812)的備選方案。即,作為一個(gè)備選實(shí)施例,圖8的方法包括在把消息發(fā)送(710)給目的應(yīng)用程序之前,把集成消息(208)從中間消息格式(804)轉(zhuǎn)譯(810)成目的應(yīng)用(116)可用的目的消息格式(812)。這種備選方案可用在目的應(yīng)用程序預(yù)期的消息格式不同于用于適配器內(nèi)的數(shù)據(jù)結(jié)構(gòu)變換(806)的中間格式(804)的許多實(shí)施例中。這種實(shí)施例的例子包括其中中間格式為XML,目的格式為HTML、字符串化Java、二進(jìn)制C++結(jié)構(gòu)或者除XML之外的任何其它消息格式的那些實(shí)施例。
圖9是圖解說(shuō)明通過(guò)適配器,在應(yīng)用之間傳送(圖2上的206)集成消息的方法的調(diào)用序列圖。更具體地說(shuō),圖9描述了通過(guò)根據(jù)本發(fā)明的實(shí)施例的例證適配器,在應(yīng)用之間傳遞集成消息的協(xié)作對(duì)象中的成員方法之間的例證調(diào)用序列。當(dāng)適配器如上詳細(xì)所述被例示、構(gòu)成和運(yùn)行時(shí),開(kāi)始圖6的序列。適配器的接收器(312)接收消息,并調(diào)用(902)它自己的translation()方法(圖5d上的575)。translation()方法把消息的主體的格式轉(zhuǎn)譯成中間格式。
接收器(312)構(gòu)成(904)消息事件對(duì)象(536,在圖5b上的602的類別結(jié)構(gòu)),當(dāng)消息在適配器內(nèi)的對(duì)象之間傳遞時(shí),用作消息的容器,以便進(jìn)一步處理和傳送給其目的地。消息事件對(duì)象的構(gòu)造器接收消息的描述參數(shù)作為調(diào)用參數(shù)以及消息本身的主體,向接收器返回對(duì)消息事件對(duì)象的引用。
接收器(312)通過(guò)對(duì)transportEvent()方法(圖5a上的532)的調(diào)用(906)傳遞消息事件對(duì)象,確切地說(shuō),把對(duì)消息事件對(duì)象的引用傳遞給在接收器中的事件監(jiān)聽(tīng)列表(圖5d上的564)中列舉的事件監(jiān)聽(tīng)器對(duì)象。
事件監(jiān)聽(tīng)器中的transportEvent()方法通過(guò)每個(gè)傳送管理器中的process()方法(圖5f上的618,圖5g上的609),調(diào)用(906)在適配器中的傳送管理器列表(圖5a上的514)中列舉的每個(gè)傳送管理器,傳送對(duì)消息事件對(duì)象的引用作為調(diào)用參數(shù)。另一方面,transportEvent()方法根據(jù)路由圖列表推斷路由圖標(biāo)識(shí),隨后調(diào)用推斷的路由圖標(biāo)識(shí)所識(shí)別的每個(gè)傳送管理器中的process()方法??傊{(diào)用的每個(gè)傳送管理器依次對(duì)消息事件對(duì)象中的消息的主體進(jìn)行每個(gè)傳送管理器被設(shè)計(jì)成執(zhí)行的無(wú)論什么處理,例如包括數(shù)據(jù)結(jié)構(gòu)變換,安全檢查,源驗(yàn)證,加密,解密,數(shù)字簽名的核實(shí),和本領(lǐng)域的技術(shù)人員易于想到的其它功能。圖5g是為利用XSLT的數(shù)據(jù)轉(zhuǎn)譯優(yōu)化的具體傳送管理器類別的一個(gè)例子。圖5f是只提供可從其承襲許多具體的傳送管理器類別的一個(gè)接口的抽象傳送管理器類別。利用具體的傳送管理器來(lái)實(shí)現(xiàn)用于各種處理目的的類別(每個(gè)所述類別承襲自抽象的傳送管理器類別)支持適配器的諸如createTransferManager()(圖5a上的532)之類的工廠方法的使用。工廠類別的使用和對(duì)照傳送管理器列表(514)的transportEvent()(圖5a上的532)處理意味著適配器對(duì)象本身不必知道也不必關(guān)心哪個(gè)特定的傳送管理器負(fù)責(zé)任何消息的主體,從而支持適配器內(nèi)的對(duì)象之間相對(duì)于消息內(nèi)容的處理,被中立、透明和模塊化地實(shí)施的協(xié)作。
圖9的序列中的transportEvent()方法從適配器中的發(fā)送器列表(圖5a上的518)中識(shí)別出用于消息的目的地的傳送器中的發(fā)送器,并調(diào)用(908)目的發(fā)送器(在圖5a上的附圖標(biāo)記575圖解說(shuō)明的類別結(jié)構(gòu))中的send()方法(592)。send()方法根據(jù)需要調(diào)用(910)發(fā)送器中的translate()方法(圖5e上的593),從而使消息主體變成其目的應(yīng)用所需的形式。隨后,send()利用發(fā)送器被配置成使用的數(shù)據(jù)通信協(xié)議,把所述消息傳送給目的應(yīng)用。
應(yīng)用集成適配器的動(dòng)態(tài)變更
圖10是圖解說(shuō)明包括根據(jù)包含描述適配器(150)的數(shù)據(jù)的簡(jiǎn)表(202),構(gòu)成(204)應(yīng)用集成適配器(102)的另一應(yīng)用集成方法的數(shù)據(jù)流程圖。圖10的方法還包括接收(152)改變適配器的指令(156),和根據(jù)指令(156)改變(154)適配器。
根據(jù)圖10的方法的應(yīng)用集成適配器類似于本公開(kāi)中前面描述的其它例證適配器,一般包括數(shù)據(jù)通信傳送器,發(fā)送器,接收器,數(shù)據(jù)傳送管理器(可選)等等。但是,根據(jù)圖10的適配器還包括接收和執(zhí)行變更它們自己的指令的能力,在它們運(yùn)行時(shí),作為它們的標(biāo)準(zhǔn)操作的一部分,這樣的適配器能夠動(dòng)態(tài)地實(shí)現(xiàn)這樣的變更,而不需要停止、暫停、重新安裝或重新啟動(dòng)任何事物。
事實(shí)上,圖10的方法還包括通過(guò)變更后的適配器(103),在應(yīng)用(112、106)之間傳遞(206)集成消息(208)。即,在適配器根據(jù)圖10的方法被改變之后,適配器正常地繼續(xù)工作,除了它們現(xiàn)在包括所述變更之外。正常的適配器操作包括接收來(lái)自應(yīng)用的集成消息,根據(jù)需要轉(zhuǎn)譯消息的格式,由適配器把消息封裝在消息事件對(duì)象中,通過(guò)傳送管理器,把消息事件對(duì)象發(fā)送給發(fā)送器,根據(jù)需要再次轉(zhuǎn)譯格式,和把消息發(fā)送給目的地,本公開(kāi)中前面已詳細(xì)說(shuō)明了所有這些操作。
變更會(huì)影響所有適配器元件,傳送器,接收器,發(fā)送器,傳送管理器等等。變更會(huì)影響受配置參數(shù),電話號(hào)碼,端口號(hào),網(wǎng)絡(luò)地址,URI等影響的所有適配器操作。配置參數(shù)的一些變化如此顯著,以致實(shí)際上要求某一組件的整個(gè)替換,例如從一種通信協(xié)議到另一種通信協(xié)議的完全變化。變更可包括這樣的變化向正在運(yùn)行的適配器增加一個(gè)新的傳送器,新的接收器,新的發(fā)送器,零個(gè)或者更多的新的傳送管理器,以便支持全新的應(yīng)用的集成。變更可包括刪除或停止現(xiàn)有接收器、發(fā)送器或者傳送管理器的操作,而適配器的剩余部分繼續(xù)工作,而不暫停、停止或重新啟動(dòng)。但是,排除暫停、停止或重新啟動(dòng)并不是對(duì)本發(fā)明的限制。實(shí)施例可包括暫停、停止或重新啟動(dòng),事實(shí)上,管理集成消息本身可包括實(shí)現(xiàn)適配器的組件或者整個(gè)適配器的暫停、停止或重新啟動(dòng)的變更指令。
在圖10的方法中,描述適配器的數(shù)據(jù)(150)包含識(shí)別通信協(xié)議的數(shù)據(jù)和識(shí)別應(yīng)用程序的數(shù)據(jù)?!懊枋鲞m配器的數(shù)據(jù)”(150)一般是在簡(jiǎn)表(202)中陳述的傳送器、發(fā)送器、接收器、傳送管理器、圖路線的標(biāo)識(shí),以及它們的配置參數(shù),這些在本公開(kāi)中前面已詳細(xì)說(shuō)明。在數(shù)據(jù)通信模塊和它們的配置參數(shù)都特定于協(xié)議的意義上,數(shù)據(jù)通信模塊,發(fā)送器和接收器的配置參數(shù)是“識(shí)別通信協(xié)議的數(shù)據(jù)”。使用HTTP的接收器具有用于配置參數(shù)的IP地址和端口號(hào)。通過(guò)電話線傳送文件的發(fā)送器具有用于配置參數(shù)的文件名和電話號(hào)碼。諸如此類。類似地,傳送器、發(fā)送器和接收器的身份和配置參數(shù)一般是“識(shí)別應(yīng)用程序的數(shù)據(jù)”,因?yàn)樗鼈円彩翘囟ㄓ趹?yīng)用程序的。接收器一般期望接收特定數(shù)據(jù)格式(具有特定的數(shù)據(jù)結(jié)構(gòu))的消息,并且通常這樣的特殊性與特定的應(yīng)用程序相聯(lián)系。一個(gè)傳送器、接收器或發(fā)送器和一個(gè)以上的應(yīng)用程序一起使用在本發(fā)明的范圍之內(nèi),不過(guò)盡管那樣,其實(shí)現(xiàn)仍然一般應(yīng)該是特定于應(yīng)用的,因?yàn)樾枰诤?jiǎn)表中規(guī)定這種模塊的獨(dú)立實(shí)例,并且專用于與應(yīng)用的特定實(shí)例通信。出于所有這些原因,即使在簡(jiǎn)表中并不出現(xiàn)特定應(yīng)用或協(xié)議本身的名稱,然而一般來(lái)說(shuō),描述適配器的數(shù)據(jù)(150)一般確實(shí)直接或間接地,明確或含蓄地識(shí)別通信協(xié)議和應(yīng)用程序。
在根據(jù)圖10的方法實(shí)現(xiàn)的許多適配器中,接收(152)變更適配器(102)的指令(156)包括檢測(cè)(164)適配器簡(jiǎn)表(202)中的變化。在許多這樣的實(shí)施例中,適配器簡(jiǎn)表是駐留在文件系統(tǒng)的某一路徑位置的可編輯文件。在許多實(shí)施例中,適配器簡(jiǎn)表是易于編輯的文本文件,比如XML文件。被授權(quán)編輯適配器簡(jiǎn)表的用戶可在任何時(shí)候利用文本編輯器或者字處理器編輯這樣的文件。事實(shí)上,被授權(quán)編輯適配器簡(jiǎn)表的用戶可在適配器正在運(yùn)行時(shí)編輯簡(jiǎn)表,從而創(chuàng)建不再準(zhǔn)確描述其適配器的簡(jiǎn)表。
在這樣的實(shí)施例中,檢測(cè)(164)適配器簡(jiǎn)表(202)中的變化常常還包括創(chuàng)建(158)簡(jiǎn)表的副本(203),并定期(162)比較(160)簡(jiǎn)表(202)和所述副本(162)。即,接收變更適配器的指令的一種方式是適配器自己保持其簡(jiǎn)表的副本,并定期比較簡(jiǎn)表的副本與簡(jiǎn)表本身。如果比較之間,簡(jiǎn)表發(fā)生變化,那么簡(jiǎn)表中的變化被解釋成變更指令。即,在這樣的實(shí)施例中,簡(jiǎn)表的變化包含變更指令。
例如,如果在這樣的實(shí)施例中,簡(jiǎn)表的副本(203)是
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver configParms=″abc″></receiver>
<sender configParms=″xyz″></sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver configParms=″def″></receiver>
<sender configParms=″uvw″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″
order=″1″></transferManager>
<transferManager class=″xfrMgr2.java″
order=″2″></transferManager>
</transfermodules>
</adapter>
改變后的簡(jiǎn)表(202)為
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver configParms=″abc″></receiver>
<sender configParms=″xyz″></sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver configParms=″def″></receiver>
<sender configParms=″uvw″></sender>
</transport>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiver configParms=″ghi″></receiver>
<sender configParms=″rst″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″
order=″1″></transferManager>
<transferManager class=″xfrMgr2.java″
order=″2″></transferManager>
<transferManager class=″xfrMgr2.java″
order=″3″></transferManager>
</transfermodules>
</adapter>
從而比較之后的檢測(cè)變化,于是變更適配器的指令(156)是
<add>
<transportmodules>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiver configParms=″ghi″></receiver>
<sender configParms=″rst″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr2.java″
order=″3″></transferManager>
</transfermodules>
</add>
對(duì)于另一例子來(lái)說(shuō),如果簡(jiǎn)表的副本(203)是
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver configParms=″abc″></receiver>
<sender configParms=″xyz″></sender>
</transport>
<transportclass=″GeneralLedger.java″id=″generalLedger″>
<receiver configParms=″def″></receiver>
<sender configParms=″uvw″></sender>
</transport>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiverconfigParms=″ghi″></receiver>
<sender configParms=″rst″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″
order=″1″></transferManager>
<transferManager class=″xfrMgr2.java″
order=″2″></transferManager>
<transferManager class=″xfrMgr2.java″
order=″3″></transferManager>
</transfermodules>
</adapter>
變化后的簡(jiǎn)表(202)是
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver configParms=″abc″></receiver>
<sender configParms=″xyz″></sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver configParms=″def″></receiver>
<sender configParms=″uvw″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″
order=″1″></transferManager>
<transferManager class=″xfrMgr2.java″
order=″2″></transferManager>
</transfermodules>
</adapter>
從而比較之后檢測(cè)到的變化,于是用于變更適配器的指令(156)是
<delete>
<transportmodules>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiver configParms=″ghi″></receiver>
<sender configParms=″rst″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr2.java″
order=″3″></transferManager>
</transfermodules>
</delete>
對(duì)于另一例子來(lái)說(shuō),如果簡(jiǎn)表的副本(203)是
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver configParms=″abc″></receiver>
<sender configParms=″xyz″></sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver configParms=“def”></receiver>
<sender configParms=″uvw″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″
order=″1″></transferManager>
<transferManager class=″xfrMgr2.java″
order=″2″></transferManager>
</transfermodules>
</adapter>
變化后的簡(jiǎn)表(202)是
<adapter>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver configParms=“jkl”></receiver>
<sender configParms=“mno”></sender>
</transport>
<transport class=″GeneralLedger.java″id=″generalLedger″>
<receiver configParms=″def″></receiver>
<sender configParms=″uvw″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr1.java″
order=″1″></transferManager>
<transferManager class=″xfrMgr3.java″
order=″2″></transferManager>
</transfermodules>
</adapter>
從而比較之后檢測(cè)到的變化,于是用于變更適配器的指令(156)是
<changeParms>
<transportmodules>
<transport class=″InventoryControl.java″id=″inventoryControl″>
<receiver configParms=″jkl″></receiver>
<sender configParms=″mno″></sender>
</transport>
</transportmodules>
</changeParms>
<delete>
<transfermodules>
<transferManager class=″xfrMgr2.java″order=″2″></transferManager>
</transfermodules>
</delete>
<add>
<transfermodules>
<transferManager class=″xfrMgr3.java″order=″2″></transferManager>
</transfermodules>
</add>
變更適配器的指令的該例子包括改變用于庫(kù)存管理應(yīng)用程序的發(fā)送器和接收器的操作參數(shù)的指令。可通過(guò)對(duì)配置方法,例如在圖5d的附圖標(biāo)記(566)所示的用于接收器的配置方法,在圖5e的附圖標(biāo)記(584)所示的用于發(fā)送器的配置方法,和在圖5f和5g的附圖標(biāo)記(621)所示的用于傳送管理器的配置方法的額外調(diào)用,完成參數(shù)的改變。從而例如對(duì)于通過(guò)HTTP實(shí)現(xiàn)數(shù)據(jù)通信的發(fā)送器和接收器,參數(shù)改變可包括端口號(hào)和IP地址的改變。
另外,本公開(kāi)中剛剛在上面的例證變更指令包括刪除具體化為Java類別xfrMgr2.java的傳送管理器,并用具體化為Java類別xfrMgr3.java的傳送管理器來(lái)代替。通過(guò)使用和用下述偽代碼描述的類似的變化檢測(cè)器類別,實(shí)現(xiàn)這樣的刪除
Class ChangeDetector extends Thread{private StringaProfile,aCopy;private String instructionsForAlterations;private AdaptermyAdapter;public void setAProfile();public void setMyAdapter();public void run(){while(1){//run forever<!-- SIPO <DP n="50"> --><dp n="d50"/>aCopy=createCopy(aProfile);sleep(60,000);//wait a minute60,000 millisecondsinstructionsForAlterations=compare(aProfile,aCopy);alter(Adapter myAdapter,String instructionsForAlterations);}}}
該例證偽代碼宣布ChangeDetector為線程的子類別,并超越出自線程類別的run()方法,從而變化檢測(cè)器能夠在適配器內(nèi)異步工作,當(dāng)變化出現(xiàn)時(shí)檢測(cè)變化,或者在本例中,至少在變化出現(xiàn)后的一分鐘內(nèi)檢測(cè)變化。一般從適配器對(duì)象(圖5a上的520)中的main()方法或者甚至從適配器的構(gòu)造器調(diào)用的下述例證Java偽代碼隨后能夠創(chuàng)建變化檢測(cè)器的獨(dú)立的執(zhí)行線程,并開(kāi)始其運(yùn)行
ChangeDetector aChangeDetector=newChangeDetector();
aChangeDetector.start();
這樣的變化檢測(cè)器對(duì)象能夠通過(guò)其構(gòu)造器或者通過(guò)諸如setAProfile()之類的存取器方法,獲得對(duì)簡(jiǎn)表的文件名的引用。變化檢測(cè)器對(duì)象的這個(gè)例子同樣從其構(gòu)造器或者通過(guò)諸如setMyAdapter()之類的存取器方法,獲得對(duì)其適配器的引用。借助下述例證偽代碼,可從Adapter.main()調(diào)用存取器方法
aChangeDetector.setAProfile(String profileFilename);
aChangeDetector.setMyAdapter(Adapter myAdapter);
圖10的方法包括根據(jù)指令(156)變更(154)適配器??扇缟厦骊愂龅陌瑢?duì)下述例證方法的調(diào)用的偽代碼變化檢測(cè)器類別中所示,實(shí)現(xiàn)適配器的變更
alter(Adapter myAdapter,String instructionForAlteration);
該alter()方法接受對(duì)適配器的引用以及包含變更適配器的指令的字符串作為調(diào)用參數(shù)。本例中的alter()方法被編程為根據(jù)變更適配器,以便創(chuàng)建新的適配器組件,刪除現(xiàn)有的適配器組件,或者改變現(xiàn)有適配器組件的操作參數(shù)的指令工作。
在一些實(shí)施例中,類似于alter()例子的方法按照本公開(kāi)中上面所述的構(gòu)成適配器的類似方式,創(chuàng)建新的適配器組件。即,在根據(jù)下述變更指令變更適配器的過(guò)程中
<add>
<transportmodules>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiver configParms=″ghi″></receiver>
<sender configParms=″rst″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr2.java″
order=″3″></transferManager>
</transfermodules>
</add>
類似于alter()例子的方法例示類別Purchasing.java的傳送器對(duì)象,例示接收器,用配置參數(shù)“ghi”配置接收器,在適配器的接收器列表中列舉該接收器,通過(guò)對(duì)傳送器中的工廠方法的調(diào)用,例示發(fā)送器,用配置參數(shù)“rst”配置該發(fā)送器,在適配器的發(fā)送器列表中列舉該發(fā)送器,例示類別xfrMgr2.java的傳送管理器,在適配器的傳送管理器列表中列舉該傳送管理器等等。
在一些實(shí)施例中,類似于alter()例子的方法通過(guò)調(diào)用組件自身中的成員方法,刪除現(xiàn)有的適配器組件。即,在根據(jù)下述變更指令變更適配器的過(guò)程中
<delete>
<transportmodules>
<transport class=″Purchasing.java″id=″purchasingSystem″>
<receiver configParms=″ghi″id=″rcvl″></receiver>
<sender configParms=″rst″id=″snd1″></sender>
</transport>
</transportmodules>
<transfermodules>
<transferManager class=″xfrMgr2.java″id=′xfrMgr2″
order=″3″></transferManager>
</transfermodules>
</delete>
類似于alter()例子的方法一般調(diào)用適配器自身中的存取器方法。記住在根據(jù)本發(fā)明的許多例證適配器中,Adapter.main()通過(guò)利用保存在適配器自身內(nèi)的列表(圖5a上的514、516、518)識(shí)別接收器、發(fā)送器和傳送管理器,來(lái)完成其處理。如果某一傳送管理器,接收器或者發(fā)送器從列表中被除去,那么適配器不再知道該傳送管理器、接收器或者發(fā)送器存在。是Java中,無(wú)用單元收集將除去不使用的對(duì)象。在C++中,刪除方法理應(yīng)還需要調(diào)用破壞器來(lái)除去不使用的對(duì)象。在獨(dú)立的執(zhí)行線程中工作的異步接收器還需要使它們的線程被停止。
更具體地說(shuō),在本例中,alter()方法被編程為調(diào)用Adapter.deletesender(String″snd1″)(圖5a上的256)來(lái)刪除發(fā)送器。deletesender()方法被編程為在其發(fā)送器列表(圖5a上的518)中查找名為“snd1”的發(fā)送器,并從所述列表中除去該發(fā)送器。在Java中,that is all there is to it。Java無(wú)用單元收集將清除不使用的發(fā)送器對(duì)象。在C++中,deletesender()會(huì)從發(fā)送器列表獲得對(duì)發(fā)送器的引用,調(diào)用該發(fā)送器的構(gòu)造器,并從發(fā)送器列表中除去該發(fā)送器。在這樣的例證實(shí)施例中,按照相同的方式刪除傳送管理器alter()調(diào)用deleteTransferManager(String“xfrMgr2”)(圖5a上的252),deleteTransferManager()又通過(guò)調(diào)用傳送管理器的破壞器(如果需要),從傳送管理器列表(514)中除去該傳送管理器。
被輪詢的接收器按照相同的方式被刪除,但是在獨(dú)立的執(zhí)行線程中工作的異步接收器最好還使它們的線程也被停止。承襲自Java的“Thread”類別的Java對(duì)象包括突然中斷Java線程的操作的stop()方法。也可通過(guò)在Java線程中包括通過(guò)設(shè)置某一成員標(biāo)記,用信號(hào)通知需要停止,從而這樣的對(duì)象中的run()方法能夠定期檢查所述標(biāo)記,檢測(cè)需要停止,并有序地從run()方法返回的獨(dú)立方法,來(lái)停止Java線程。
在本發(fā)明的范圍中,有一種以上的接收變更適配器的指令的方法。圖11是圖解說(shuō)明應(yīng)用集成的另一例證方法的數(shù)據(jù)流程圖,其中接收(152)變更適配器(102)的指令(156)包含從應(yīng)用程序(107)接收承載變更適配器的指令(156)的管理集成消息(170)。
發(fā)送管理消息的應(yīng)用程序可以是編程為支持管理消息的任何應(yīng)用程序,例如當(dāng)它自己?jiǎn)?dòng)時(shí),通過(guò)HTTP傳送包括路線繪制指令的XML消息的新應(yīng)用程序,所述XML消息請(qǐng)求把一個(gè)或多個(gè)傳送器,一個(gè)或多個(gè)接收器,一個(gè)或多個(gè)發(fā)送器,以及零個(gè)或更多的傳送管理器加入適配器中,以便支持所述新應(yīng)用程序與一個(gè)或多個(gè)其它應(yīng)用程序的集成。由于這樣的新應(yīng)用程序還不具有它自己的發(fā)送消息的接收器,因此一些實(shí)施例提供專用于監(jiān)聽(tīng)管理消息的接收器的網(wǎng)絡(luò)地址并使之公用。在新的應(yīng)用程序已與它自己的接收器耦接之后,新的應(yīng)用程序隨后能夠把它自己的管理消息直接發(fā)送給適配器中它自己的接收器。
為了進(jìn)一步說(shuō)明圖11的方法,接收例程(152)被認(rèn)為被實(shí)現(xiàn)成與在圖5a的附圖標(biāo)記(560)所示的類似的接收器類別的接收器對(duì)象中的run()方法(圖5d上的574),承襲自Java的“Thread”類別,同時(shí)所述run()方法在它自己的執(zhí)行線程中異步工作。該例證的接收器非常類似于任何其它消息地管理管理集成消息(170)。即,該例證接收器如同本公開(kāi)中上面更詳細(xì)描述的異步接收器那樣工作,接收消息,根據(jù)需要轉(zhuǎn)換消息的格式,把消息封裝到消息事件中,把消息事件傳送給事件監(jiān)聽(tīng)器等等。但是,管理集成消息在接收器對(duì)它們的處理方面是不同的,因?yàn)榻邮掌髟谙⑹录?duì)象的messageType字段(圖5h上的607)中寫(xiě)入把它們識(shí)別成管理集成消息的代碼值,例如諸如“admin”之類的值。另外,接收器在這樣的消息的消息事件對(duì)象的destintionID字段(圖5h上的604)中寫(xiě)入消息的目的地是適配器本身,而不是目的應(yīng)用程序的指示。接收器把變更適配器的指令保存為消息事件對(duì)象中的消息的主體(614)。如同對(duì)于其它消息類型那樣,接收器通過(guò)調(diào)用在接收器中登記的事件監(jiān)聽(tīng)器(圖5d上的564)中的transportEvent(meaasgeEvent)方法(圖5a上的532),傳送對(duì)消息事件對(duì)象的引用。
在本例中,已獲得消息事件中的管理消息的源、目的地和類型的transportEvent()方法根據(jù)源、目的地和消息類型值,能夠識(shí)別消息事件的路由圖,并把攜帶變更適配器的指令的消息事件發(fā)送給一個(gè)或多個(gè)傳送管理器,如同對(duì)于任何其它消息所做的那樣。傳送管理器可被編程并組織到某一路線中,以便執(zhí)行變更適配器,創(chuàng)建新組件,刪除或改變現(xiàn)有組件的參數(shù)等的細(xì)節(jié)。
作為對(duì)使用傳送管理來(lái)實(shí)現(xiàn)適配器的變更的一種備選方案,在一些實(shí)施例中,transportEvent()方法被編程為注意傳送給它的消息事件的消息類型代碼,并把管理消息轉(zhuǎn)給用于執(zhí)行變更適配器的指令的成員方法,例如按照和上面關(guān)于類別ChangeDetector中的alter()所述類似的方式工作的成員方法alter()(圖5a上的258)。即,如下所示,Adaper.alter()可被transportEvent()調(diào)用
Adapter.alter(MessageEvent aMessageEvent);
Adapter.alter()的操作稍微不同于ChangeDetector.alter()。ChangeDetector.alter()接受對(duì)適配器的引用和包含變更適配器的指令的字符串作為調(diào)用參數(shù)。但是,Adapter.alter()是要被變更的適配器的適配器對(duì)象內(nèi)的成員方法,因此不需要接受對(duì)適配器的引用作為調(diào)用參數(shù)。另外,事件監(jiān)聽(tīng)器中的transportEvent()方法只被編程為轉(zhuǎn)移管理消息事件,而不進(jìn)一步處理管理消息事件。于是在本例中,transportEvent()方法不抽取消息主體,即變更適配器的指令,和將其傳送給Adapter.alter()作為String。相反,transportEvent()方法把整個(gè)消息事件傳送給Adapter.alter(),保留整個(gè)消息事件一直到Adapter.alter()從消息事件對(duì)象中抽取消息的主體作為包含變更適配器的指令的String為止。但是,除了這些例外,Adapter.alter()的操作與本公開(kāi)中前面詳細(xì)描述的ChangeDetector.alter()的操作類似。即,Adapter.alter()方法被編程為根據(jù)變更適配器的指令操作,以便創(chuàng)建新的適配器組件,刪除現(xiàn)有的適配器組件,或者改變現(xiàn)有適配器組件的操作參數(shù),如同本公開(kāi)中前面關(guān)于ChangeDetector.alter()詳細(xì)說(shuō)明的那樣。
管理消息的接收器可被輪詢,另外是異步的。在典型的輪詢實(shí)施例中,不存在事件監(jiān)聽(tīng)器,也可不存在transportEvent()方法。相反,接收器中的run()方法會(huì)直接把消息事件返回給輪詢例程,在本例中,適配器中的main()方法(圖5a上的520)。輪詢例程會(huì)注意messageEvent.messageType=″admin″,并把消息事件傳送給alter()方法(圖5a上的258),以便根據(jù)封裝在消息事件的主體String(圖5h上的614)中的指令,進(jìn)行對(duì)適配器的變更。
在根據(jù)圖11的適配器中,根據(jù)指令(156)變更(154)適配器一般還包括更新(172)簡(jiǎn)表(202)以反映所述指令,從而簡(jiǎn)表保持變更后的適配器的當(dāng)前的正確描述。在使用XML文檔作為簡(jiǎn)表中的實(shí)施例中,可通過(guò)文本編輯器或者字處理器手動(dòng)進(jìn)行更新。另一方面,對(duì)于這樣的實(shí)施例來(lái)說(shuō),常常通過(guò)編程為把變更簡(jiǎn)表的指令,以及舊簡(jiǎn)表結(jié)合成一個(gè)更新后的簡(jiǎn)表,一個(gè)新的XML文檔的update()方法,使更新自動(dòng)化。在把解析的簡(jiǎn)表(圖5b上的502)保存在工作存儲(chǔ)器中的實(shí)施例中,變更(154)適配器常常包括把更新后的簡(jiǎn)表解析(圖5a上的522)解析成工作存儲(chǔ)器中的解析簡(jiǎn)表,從而解析簡(jiǎn)表也和描述根據(jù)指令(156)變更后的適配器組件的當(dāng)前正確的內(nèi)容一起被保存。
權(quán)利要求
1、一種應(yīng)用集成方法,所述方法包括
根據(jù)包含描述應(yīng)用集成適配器的數(shù)據(jù)的簡(jiǎn)表,構(gòu)成所述適配器;
接收變更所述適配器的指令;和
根據(jù)所述指令變更所述適配器。
2、按照權(quán)利要求1所述的方法,其中應(yīng)用集成適配器包括
數(shù)據(jù)通信傳送器,所述數(shù)據(jù)通信傳送器包括發(fā)送器和接收器,和
可選的數(shù)據(jù)傳送管理器。
3、按照權(quán)利要求1所述的方法,其中描述所述適配器的數(shù)據(jù)包括
識(shí)別通信協(xié)議的數(shù)據(jù),和
識(shí)別應(yīng)用程序的數(shù)據(jù)。
4、按照權(quán)利要求1所述的方法,還包括通過(guò)變更后的適配器,在應(yīng)用之間傳遞集成消息。
5、按照權(quán)利要求1所述的方法,其中接收變更所述適配器的指令還包括檢測(cè)所述適配器簡(jiǎn)表中的變化。
6、按照權(quán)利要求5所述的方法,其中檢測(cè)所述適配器簡(jiǎn)表中的變化還包括
創(chuàng)建所述簡(jiǎn)表的副本;和
定期比較所述簡(jiǎn)表和所述副本。
7、按照權(quán)利要求1所述的方法,其中接收變更所述適配器的指令還包括從應(yīng)用接收承載變更所述適配器的指令的管理集成消息。
8、按照權(quán)利要求7所述的方法,其中根據(jù)指令變更所述適配器還包括更新所述簡(jiǎn)表。
9、一種應(yīng)用集成系統(tǒng),所述系統(tǒng)包括
根據(jù)包含描述應(yīng)用集成適配器的數(shù)據(jù)的簡(jiǎn)表,構(gòu)成所述適配器的裝置;
接收變更所述適配器的指令的裝置;和
根據(jù)所述指令變更所述適配器的裝置。
10、按照權(quán)利要求9所述的系統(tǒng),其中所述應(yīng)用集成適配器包括
數(shù)據(jù)通信傳送器,所述數(shù)據(jù)通信傳送器包括發(fā)送器和接收器,和
可選的數(shù)據(jù)傳送管理器。
11、按照權(quán)利要求9所述的系統(tǒng),其中描述適配器的數(shù)據(jù)包括
識(shí)別通信協(xié)議的數(shù)據(jù),和
識(shí)別應(yīng)用程序的數(shù)據(jù)。
12、按照權(quán)利要求9所述的系統(tǒng),還包括通過(guò)變更后的適配器,在應(yīng)用之間傳遞集成消息的裝置。
13、按照權(quán)利要求9所述的系統(tǒng),其中接收變更適配器的指令的裝置還包括檢測(cè)適配器簡(jiǎn)表中的變化的裝置。
14、按照權(quán)利要求13所述的系統(tǒng),其中檢測(cè)適配器簡(jiǎn)表中的變化的裝置還包括
創(chuàng)建簡(jiǎn)表的副本的裝置;和
定期比較所述簡(jiǎn)表和所述副本的裝置。
15、一種可直接載入數(shù)字計(jì)算機(jī)的內(nèi)部存儲(chǔ)器中的計(jì)算機(jī)程序產(chǎn)品,包含當(dāng)所述產(chǎn)品在計(jì)算機(jī)上運(yùn)行時(shí),實(shí)現(xiàn)權(quán)利要求1-8的發(fā)明的軟件代碼部分。
全文摘要
應(yīng)用集成的系統(tǒng)和方法,包括根據(jù)包括描述適配器的數(shù)據(jù)的簡(jiǎn)表,構(gòu)成應(yīng)用集成適配器,接收變更所述適配器的指令,和根據(jù)所述指令變更所述適配器。本發(fā)明的實(shí)施例包括通過(guò)變更后的適配器在應(yīng)用之間傳遞集成消息。在典型的實(shí)施例中,接收變更適配器的指令包括檢測(cè)適配器簡(jiǎn)表中的變化。在這樣的實(shí)施例中,檢測(cè)適配器簡(jiǎn)表中的變化包括創(chuàng)建簡(jiǎn)表的副本,和定期比較所述簡(jiǎn)表和所述副本。在其它例證實(shí)施例中,接收變更適配器的指令包括從應(yīng)用接收承載變更適配器的指令的管理集成消息。在這樣的實(shí)施例中,根據(jù)指令變更適配器包括更新所述簡(jiǎn)表。
文檔編號(hào)G06F9/46GK1754148SQ20048000536
公開(kāi)日2006年3月29日 申請(qǐng)日期2004年2月13日 優(yōu)先權(quán)日2003年2月26日
發(fā)明者邁克爾·吉爾福克斯, 杰麗·沃爾特·馬爾科姆, 福爾尤索·奧萊雅·奧昆賽恩德, 蒂龍·杰羅德·斯德丁, 保羅·斯圖爾特·威廉森, 斯科特·李·溫特斯 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司