在本系列的第 1 部分,我們引入了服務組件體系結構作為編程模型來構建和組裝集成解決方案,簡要介紹了什么是 SCA,以及一些相關術語的定義。在第 2 部分,我們討論了引用和限定符,并說明了如何將各種組件連接到一起以創建 SCA 模塊。在第 3 部分,我們將深入了解構建 SCA 模塊的主要好處之一,即能以各種組件為基礎垂直構建集成解決方案。
隨著系統不斷發展而變得更為復雜,有必要將各種解決方案進行水平集成;組織中的不同部門可能需要構建自己的解決方案并稍后將其集成到一起,或者可能不同的業務合作伙伴將需要通過 Internet 集成其解決方案。圖 1 顯示了一個此類水平集成的示例:
圖 1. 集成系統
我們在第 1 部分中定義了 SCA 導入和導出,但我們將在本文中對其進行更為深入的研究,并繼續構建我們的精簡示例。具體來說,將重點討論使用 SCA 綁定的 SCA 導入和導出。SCA 綁定允許一個模塊中的 SCA 組件使用 SCA 編程模型與另一個模塊中的 SCA 組件通信。
在本文中,我們還將升級到 IBM WebSphere Integration Developer V6.0.1,該版本允許構建特定的集成解決方案,以將 IBM WebSphere Process Server V6.0.1 或 IBM WebSphere Enterprise Service Bus V6.0.1 解決方案結合使用。在這個新版本中,我們還添加了對構建各種企業服務總線(Enterprise Service Bus,ESB)中介的支持。(WebSphere ESB 運行時是 WebSphere Process Server 的子集;有關更多信息,請參閱參考資料。)
導入與導出回顧
正如在第 1 部分中提到的,用于進行模塊到模塊和模塊到外部服務調用的機制分別稱為導入和導出。導入和導出是從模塊角度而言,而模塊是一個執行特定業務功能的自包含組件包:
圖 2 顯示了一個使用導入和導出的 SCA 組裝。該圖表明,導出是外部的入口點,而導入則允許您調用模塊外的功能。
圖 2. SCA 導入和導出
當通過導入和導入調用 SCA 組件時,參數將按值傳遞,即參數將從一個結構中復制到另一個結構。圖 3 顯示了兩個彼此進行通信的 SCA 模塊,并說明了 SCA 導入如何與 SCA 導出匹配。
圖 3. SCA 導入和導出
將 SCA 組件粘附到一起的連接機制抽象出了大部分基礎結構級的代碼。例如,可以將連接機制定義為同步或異步的,操作可以為單向的或為請求-響應型,或者可以定義組件間的事務處理行為。SCA 將為您處理基礎結構細節。
導入和導出可以與其他技術綁定,如 JMS、Enterprise JavaBeans (EJB) 或 Web 服務,如圖 4 所示。通過綁定到這些技術,可以通過使用 SCA 編程模型來讓 Web 服務客戶機調用 SCA 模塊,或者讓 SCA 模塊調用現有 EJB 模塊(由于 EJB 導入是由 Java? 接口定義的,所以使用 EJB 導入有一些限制;因此,BPEL 之類——要求合作伙伴支持 WSDL——無法調用 EJB 導入。詳見后文)。
圖 4. 與其他技術的導入與導出
導入/導出綁定
面向服務的體系結構的一個關鍵在于能夠公開采用大量綁定選項的服務,以及能夠使用行業規范調用服務。正如所指出的,WebSphere Process Server 和 WebSphere ESB 提供了一系列不同的綁定類型來幫助滿足此類需求。綁定類型使用 Assembly Editor 與導出和導入關聯。目前有五種主要的綁定類型:
-
SCA——用于模塊間的 SCA 調用的綁定類型。該綁定類型是配置最簡單的類型,可提供模塊間的無縫集成。
-
Web 服務——可提供調用外部 Web 服務和將模塊內的功能作為 Web 服務公開的功能。缺省情況下,Web 服務將使用 doc-lit 包裝樣式,可以與 HTTP 和 JMS 協議一起使用。Web 服務綁定功能是從基礎 WebSphere Application Server 基本 Web 服務引擎派生的,受到相同的限制。
-
企業信息系統(Enterprise Information Systems,EIS)——提供通過 WebSphere JCA Adapter 集成到現有 EIS 系統的功能。此綁定類型的可用配置將根據目標不同而有所改變(SAP、JDBC Adapter 等等)。企業數據發現服務通常與每個適配器一起提供,以幫助創建業務對象和導入與導出綁定。
-
Java Messaging Service——提供與使用 JMS 作為消息傳遞協議的端點進行集成的功能。在這種情況下,導入和導出使用數據綁定來幫助解析正確的業務對象/操作組合。
-
無狀態會話 Bean——提供使用 Java 接口與無狀態會話 Bean 集成的功能。此功能只有在將 Java 引用連接到 Java 接口時才可用。在 WebSphere Integration Developer 中,使用 WSDL 引用的組件不允許連接到無狀態會話 Bean 提供的 Java 接口。在此情況下,要求使用具有 WSDL 接口和 Java 引用的中間組件。
在本文中,我們將更深入地討論 SCA 綁定的情況。本系列的后續文章將對其他導入/導出綁定進行更為深入的分析。
SCA 綁定
SCA 綁定提供了一致的方法來在 WebSphere Process Server 或 WebSphere ESB 環境中跨模塊邊界進行通信。將基于客戶機模塊使用的調用模式自動選擇 SCA 綁定所使用的基礎協議。
SCA 提供四種調用模式。
-
同步——客戶機發出請求,并等待響應。
-
異步單向——客戶機發出請求,不等待響應。
-
異步延遲響應——客戶機發出請求,客戶機將在稍后請求響應。
-
異步回調——客戶機發出請求,目標將調用使用響應調用客戶機實現的服務。
WebSphere Process Server 或 WebSphere ESB SCA 運行時將確定何時使用基礎系統集成總線(對于異步調用模式)或 RMI/IIOP(對于同步調用模式)。
SCA 綁定是由導出驅動的。在 SCA 模塊安裝到 WebSphere Process Server 的過程中,將創建必要的支持構件:
- 對于異步調用,將在 SCA.SYSTEM.<cell name>.Bus 中創建計算單元范圍內的服務集成總線(Service Integration Bus,SIBus)目的地。
- 對于同步通信,將創建一個指向模塊會話 Bean 的計算單元范圍內的名稱空間綁定;模塊會話 Bean 是無狀態會話 Bean,供模塊用于各種目的,如作為工作邊界、安全配置等的單元。
導入和導出文件一起工作,其中導入文件包含關于導出的重要信息,可幫助任意數量的客戶機導入目標服務。
SCA 運行時通過使用 .import 文件中的信息和調用模式(sync 或 async),可確定是使用 SIBus 目的地還是 WebSphere 名稱空間綁定。
將創建一系列 SIBus(請參閱參考資料)目的地來支持 WebSphere Process Server 和 WebSphere ESB 提供的各種異步調用類型;將為模塊、組件、導入和導出創建目的地。每個目的地和轉發路由路徑將確保將消息路由到正確的目標服務。圖 5 顯示了 SIBus 目的地的一個示例。
圖 5. SIBus 目的地
此外,將為模塊中的每個 SCA 導出創建一個名稱空間綁定,如圖 6 中所示。此綁定將在計算單元范圍內創建,并遵循以下命名模式:
sca_ + <Module Name> + _export_ + <ExportName>。
圖 6. 名稱空間綁定
在給定這兩組構件范圍的情況下,SCA 導出綁定在整個計算單元內都可見。客戶端模塊和目標模塊可以放置在計算單元內的任何 WebSphere Process Server 或 WebSphere ESB 服務器上,且仍然能夠進行通信。
導出限定符
使用 SCA 綁定的導入是 SCA 組件在另一個模塊中的邏輯表示。因此,可以采用與圖 7 所示相同的方法在指向導出的引用上定義限定符。
圖 7. 添加限定符
導出并不包含任何限定符;相反,將要在導出的組件上放置限定符,詳見第 2 部分中的說明。
庫項目
跨越模塊邊界,必須考慮共享協定這一事實。應用程序通過接口進行通信,彼此傳遞數據對象。這意味著接口和業務對象應對模塊可見,或位于與模塊相同的位置。為了減少在每個模板中重復定義相同的接口和數據對象,WebSphere Integration Developer 包括了一個特殊的 SCA 庫模塊,可以將其添加到 SCA 模塊,就像 Java JAR 文件可以為 EAR 文件中獨立的 JAR 一樣。(事實上,WebSphere Integration Developer 就是這樣處理庫的。)這就允許您在單個位置中定義接口和業務對象,然后讓所有模塊對其進行共享。稍后我們將給出一個 SCA 庫示例。
我們的示例應用程序
我們將繼續使用在整個系列中使用的 Credit Approval 應用程序。在本文中,我們將演示如何通過將 Credit History 和 Credit Agency 模塊外部化來使各個模塊分離,以了解如何配置導出和導入。為了進行說明,我們還將演示如何在模塊間共享 SCA 庫。
為了運行此示例,您將需要正確安裝 WebSphere Integration Developer V6.0.1(該版本支持 WebSphere ESB)并在您的計算機上運行(請參閱參考資料),還要獲取本文所附的下載材料,其中包含兩個 SCA 模塊(Credit Agency 和 Credit History 模塊)和一個具有共享接口及業務對象的 SCA 庫。
-
設置工作區。
-
啟動 WebSphere Integration Developer。打開新工作區并關閉歡迎屏幕。
-
您將需要導入所下載的 Project Interchange。為了導入 Project Interchange,在 Business Integration 視圖內單擊右鍵,然后選擇 Import,如圖 8 所示。
圖 8. Eclipse 導入向導
-
選擇 Project Interchange,然后選擇 Next (圖 9)。
圖 9. 導入 Project Interchange
-
選擇下載文件 <Download_root>/SCAArticlePart3.zip,然后單擊 Select All,并單擊 Finish (圖 10)。
圖 10. Select All
-
檢查我們剛剛導入的構件:
-
從 Business Integration 透視圖中展開 CreditApprovalLibrary。正如前面提到的,SCA 庫可以用于方便地保存模塊間共享的業務對象和接口。圖 11 顯示了 Business Integration 視圖中的 CreditApprovalLibrary。
圖 11. CreditApprovalLibrary
通過在 Business Integration 透視圖內上下文有關的菜單中選擇 New => Library,可以方便地創建 Library 項目。在此例中,我們已經提供了接口和數據對象。
-
展開 CreditAgencySCAModule 和 CreditHistory 模塊。
-
為每個模塊打開 Assembly Editor。在前面的第 2 部分中的示例中,我們在單個模塊中包含了多個組件。在此示例中,我們將對實現進行分離,以模擬多個獨立的解決方案。通常,SCA 具有包含多個組件的完整解決方案。對于本文,我們假定這些為不同開發組(不同的管理人員、日程安排和項目規劃)開發的完整解決方案。圖 12 顯示了 Business Integration 視圖中的 SCA 模塊。
圖 12. SCA 模塊
-
這兩個 SCA 模塊都依賴于 SCA 庫模塊;這個依賴關系可以在 Dependency Editor 看到。分別右鍵單擊每個 SCA 模塊,并選擇 Open Dependency Editor(圖 13)。
圖 13. 打開 Dependency Editor
-
檢查每個模塊對應的 Dependency Editor,以確保在兩個模塊間共享了 CreditApprovalLibrary,如果是這樣,CreditApprovalLibrary 將顯示為圖 14 所示的情況。
圖 14. CreditApprovalLibrary
- 關閉編輯器。
|
|
創建 SCA 導出
接下來,我們將為每個模塊創建 SCA 導出,以便可以從其他 SCA 模塊調用此模塊。
-
為 CreditAgencySCAModule 創建導出:
-
在 WebSphere Integration Developer 中,打開 CreditAgencySCAModule Assembly Editor。在 Business Integration 視圖中展開 CreditAgencySCAModule,并雙擊 CreditAgencySCAModule Assembly Editor 圖標,如下面的圖 15 中所示。
圖 15. 打開 Assembly Editor
-
要創建導出,請右鍵單擊 CreditApproval 組件,并選擇 Export =>SCA Binding(圖 16)。
圖 16. 創建具有 SCA 綁定的 SCA 導出
-
將自動為 CreditAgency 組件創建具有 SCA 綁定的導出,如圖 17 中所示。
圖 17. SCA 導出
-
在 Assembly Editor 中選中此導出的同時查看 Properties 視圖,以檢查導出的各個屬性。您將會在 Details 選項卡中看到操作的 SCA 詳細信息,如圖 18 中所示。
圖 18. SCA 導出詳細信息
-
切換到 Qualifiers 選項卡(圖 19)。您會發現無法添加任何限定符。這是因為導出將使用其所指向的組件的限定符。
圖 19. 導出沒有限定符
-
保存并關閉 Assembly Editor。
-
采用類似的方法為 CreditHistorySCAModule 創建導出:
-
和前面一樣,為 CreditHistorySCAModule 打開 Assembly Editor。
-
和前面一樣,生成具有 SCA 綁定的導出(圖 20)。
圖 20. SCA 導出
-
保存并關閉編輯器。
創建 Credit Approval 模塊
現在我們將創建要通過導入調用其他兩個模塊的 CreditApprovalModule。
-
首先,創建一個新的 SCA 模塊:
-
在 Business Integration 視圖中單擊右鍵,然后選擇 New => Module。
-
將該模塊命名為 CreditApprovalSCAModule
(圖 21)。確保選中 Use Default,然后單擊 Finish。
圖 21. 新建 SCA 模塊
-
右鍵單擊新創建的 CreditApprovalSCAModule,并選擇 Open Dependency Editor(圖 22)。
圖 22. 打開 Dependency Editor
-
由于 CreditApproval 模塊將調用其他兩個模塊,因此需要共享在其間傳遞的接口和業務對象。請記住,我們要使用庫來存儲這些接口和業務對象。在 Dependency Editor 中的 Libraries 節中選擇 Add,如圖 23 所示。
圖 23. 向 SCA 模塊添加庫
-
選擇 CreditApprovalLibrary,然后單擊 OK。
-
現在將創建一個調用組件。出于演示目的,我們將使用基于 Java 的簡單組件;在以后的文章中,我們將展示調用各種組件和模塊的 BPEL 流。
-
雙擊 CreditApprovalSCAModule Assembly 圖標,以打開 CreditApprovalSCAModule Assembly Editor(圖 24)。
圖 24. 打開 SCA Assembly Editor
-
將 SCA 組件
(圖 25)拖放到 Assembly Editor 上。
圖 25. 將 SCA 組件拖放到 Assembly Editor 上
-
單擊文本,并鍵入名稱,從而將組件重命名為 CreditApproval,如圖 26 中所示。
圖 26. 更改組件名稱
-
接下來,我們將向該組件添加接口。我們將接口存儲在庫項目中。
-
在組件上單擊 Interface 圖標(圖 27 的圓圈內),然后從菜單中選擇 CreditRequest。
圖 27. 向 SCA 組件添加接口
-
單擊 OK。
我們剛剛創建了一個 SCA 組件。該組件將通過導入調用其他兩個模塊。
創建導入
我們已經完成了導出的創建,現在就可以開始創建 SCA 導入了。我們需要為要調用的每個導出創建一個 SCA 導入。在我們的示例中,我們將進行以下工作:
- 調用 CreditAgency 和 CreditHistory 模塊。
- 更新 CreditHistory 導入的限定符,以在異步調用組件時正確地處理事務處理行為。
- 假定 History 請求需要花一定的時間進行調用,那么我們將異步發出 History 請求。
- 在請求之后,同步調用 CreditAgency 模塊。
- 獲取信用分數后,以延遲方式獲取 History Response。
-
首先,為 CreditAgency 調用創建導入:
-
從面板上將 import 圖標拖放到 Assembly Editor 上(圖 28)。
圖 28. 將導入拖放到 Assembly Editor 上
-
單擊文本并鍵入 CreditAgencyImport
,從而重命名導入,如圖 29 中所示。
圖 29. 重命名導入
-
接下來,我們將添加相應的接口。在此情況下,導入的接口必須與 CreditAgencySCAModule 中對應的導出的導入匹配。
單擊 Import 上方的 Interface 圖標(圖 30 的圓圈內),然后選擇 CreditAgency 接口。
圖 30. 向 SCA 導入添加導入
-
添加相應的綁定,在此例中,添加 SCA 綁定:
-
右鍵單擊導入,并選擇 Generate Binding => SCA Binding(圖 31)。
圖 31. 向導入添加 SCA 綁定
-
在 Assembly Editor 中突出顯示導入,轉到 Properties 視圖,并選擇 Binding 部分(圖 32)。單擊 Browse。
圖 32. 瀏覽導出
-
選擇 CreditAgencyExport(圖 33)。
圖 33. 選擇導出
-
接下來,我們需要將 CreditApproval 組件連接到 CreditAgencyImport。
-
在 Assembly Editor 中選擇 CreditApproval 組件,并將一個 wire 拖放到 CreditAgencyImport。
圖 34. 將 SCA 組件連接到 SCA 導入
-
在對話框中單擊 OK,以在 CreditApproval 組件上創建引用(圖 35)。(在第 2 部分中對引用進行了討論。)
圖 35. 確認引用創建
-
保存編輯器,并使其保持為打開狀態。下面的圖顯示了已連接的組件的最終結果。
圖 36. 已連接的 SCA 模塊
-
接下來,我們將為 CreditHistoryModule 創建導入。
-
和前面一樣,將另一個 import 拖放到 Assembly Editor 并將其命名為 CreditHistoryImport
。
-
向導入添加 CreditHistory 接口,如圖 37 中所示。
圖 37. 添加 Credit History 接口
-
生成 SCA 綁定,并將 CreditApproval 連接到 CreditHistoryImport。圖 38 顯示了最終的結果。
圖 38. 最終結果
請記住,我們假定 Credit History 組件的處理時間會稍微長一些,因此首先將觸發異步請求以獲取 History,并在稍后檢索響應。在 CreditHistory 運行的同時,我們將從 CreditAgency 模塊獲取 Credit Score。然后我們將從 CreditHistory 捕獲響應。我們可以為“服務”使用正確的 SCA API 來對 Credit History 模塊進行異步調用。在這種情況下,我們希望使用前面描述的延遲響應調用模式。
生成實現
-
我們現在將為 CreditApproval 組件創建一個實現。在我們的示例中,將使用一個簡單的 Java 組件。
-
在 Assembly Editor 中,右鍵單擊 CreditApproval 組件,并選擇 Generate Implementation => Java。
圖 39. 生成 Java 實現
-
暫時將該類放在缺省包中(圖 40)。
圖 40. 缺省包
-
如果希望在稍后添加本地 Java 客戶機,請在 Implement As... 對話框中選擇 Yes,以創建一個匹配的 Java 接口(圖 41)。
圖 41. 為本地 Java 客戶機創建 Java 接口
-
現在我們將編寫實現的代碼。
-
應在 Java 編輯器中打開實現類。正如您在 Java 編輯器中看到的,WebSphere Integration Developer 添加了方便的 Helper,以通過檢查模塊組裝來獲取合作伙伴。如果我們首先生成 Java 類,則這些方法將不存在。
public CreditAgency locateService_CreditAgencyPartner() {
return (CreditAgency) ServiceManager.INSTANCE
.locateService("CreditAgencyPartner");
}
public CreditHistory locateService_CreditHistoryPartner() {
return (CreditHistory) ServiceManager.INSTANCE
.locateService("CreditHistoryPartner");
}
|
-
將下面的代碼(在 <download_root>/SCAArticleSeries3/codeSnippet1.txt 中)粘貼到 calulateCreditScore 方法內。異步調用模式以粗體突出顯示。
ServiceManager serviceManager = new ServiceManager();
// create credit rating return data object using the BO factory
BOFactory bof =
(BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory"
);
DataObject creditRating = bof.create("http://CreditApproval",
"CreditRating");
creditRating.setString("customerId",
creditApp.getString("customerId"));
// create and call credit history service using async deferred response invocation
// pattern.
CreditHistoryAsync cha = (CreditHistoryAsync)
serviceManager.locateService("CreditHistoryPartner");
Ticket tix = cha.getCreditLimitAsync(creditApp);
CreditAgency creditAgency = (CreditAgency) locateService_CreditAgencyPartner();
Integer creditScore = creditAgency.getCreditScore(creditApp);
Double creditLimit = cha.getCreditLimitResponse(tix, Service.WAIT);
creditRating.setInt("creditScore", creditScore.intValue());
creditRating.setDouble("creditLimit", creditLimit.doubleValue());
return creditRating;
|
-
因為缺少導入,因此在 Eclipse Editor 中應報告一些編譯錯誤(假定啟動了自動生成功能)。在 Java 編輯器中任意位置單擊右鍵,并選擇 Source => Organize Imports,如圖 42 中所示。
圖 42. Organize imports
-
將 BOFactory 接口解析到 com.ibm.websphere.bo,如圖 43 中所示。
圖 43. 解析 BOFactory
-
將 Service 接口解析到 com.ibm.websphere.sca,如圖 44 中所示。
圖 44. 將服務導入解析到 com.ibm.websphere.sca
-
保存 Assembly Editor。
|
|
測試解決方案
現在可以測試我們的解決方案了。集成模塊時,每個模塊首先應進行相應的單元測試。在本文中,我們將假定各個開發團隊(CreditHistory 和 CreditAgency)都已對其組件進行了相應的測試。
-
將所有三個模塊都添加到 WebSphere Process Server:
-
在 WebSphere Integration Developer 中,轉到 Servers 視圖,右鍵單擊 WebSphere Process Server,并選擇 Add/Romove Project(圖 45)。
圖 45. 向 WebSphere Process Server 添加或刪除項目
-
選擇 Add All,以將全部 SCA 模塊添加到服務器(圖 46)。
圖 46. 添加所有模塊
-
單擊 Finish。
-
通過 WebSphere Integration Developer 組件測試工具啟動服務器。
- 從 CreditApproval 模塊的 Assembly Editor 中,右鍵單擊 CreditApproval 組件,并選擇 Test Component,如圖 47 所示。
圖 47. 啟動 Test Component 功能

-
轉到 Configurations 選項卡并刪除兩個模擬器,如圖 48 中所示。如果合作伙伴不可用,可以使用模擬器來進行模擬,由于我們有實際的組件,因此不需要模擬器。
圖 48. 刪除模擬器
-
回到 Events 頁,在 Initial 響應參數中輸入一些輸入數據,如圖 49 中所示,然后單擊 Continue。
圖 49. 運行組件測試
-
在 Deployment Location 對話框中,選擇 WebSphere Process Server v6.0。(圖 50)
圖 50. 選擇 WebSphere Process Server 運行時
-
現在我們將對調用路徑和結果進行檢查。
-
回到 Events 選項卡。從調用路徑中選擇最后一個 Return,以創建結果,如圖 51 中所示。
圖 51. 選擇 Return
-
應該看到與圖 52 類似的結果。
圖 52. 結果
-
如果分析調用順序,將會發現采用了異步調用:我們沒有采用“請求-響應-請求-響應”的模式,而是使用了“異步請求-請求-響應-異步響應”模式。(圖 53)
圖 53. 異步調用路徑
-
不保存,直接關閉測試編輯器并停止服務器。
結束語
通過導入和導出,我們可以將解決方案以面向服務的方式對外公開。在本文中,您了解了如何使用 SCA 導入和導出集成 SCA 解決方案。第 4 部分,我們將討論如何使用其他某些綁定(如 Web 服務和 JMS)與其他解決方案進行集成。