隨著 IBM? WebSphere Integration Developer 和 WebSphere Process Server 的發(fā)布,出現(xiàn)了一種用于構(gòu)建面向服務的體系結(jié)構(gòu) (SOA) 的新編程范式,稱為服務組件體系結(jié)構(gòu),它是為在 SOA 中構(gòu)建和組裝業(yè)務解決方案而專門設計的一個新編程模型,旨在集成和組合服務。
摘自 IBM WebSphere 開發(fā)者技術期刊。
引言
您可能認為,這太棒了,又出現(xiàn)了一個編程模型,但事實并非如此。Web 服務怎么樣了?Enterprise JavaBeans 發(fā)生了什么?服務組件體系結(jié)構(gòu) (SCA) 并非要替換任何現(xiàn)有的編程模型或者與其抗衡。相反,SCA 向您提供一個以與技術無關的方式定義接口、實現(xiàn)和引用的模型,從而使您能夠?qū)⑦@些元素綁定到所選擇的某一技術的特定實現(xiàn)。
例如,我們可以用 Java 定義我們的接口,將我們的實現(xiàn)作為 BPEL 流程加以應用,或者將接口作為一個 WSDL 文檔,而且我們的實現(xiàn)可以是一個 Java? 類。圖 1 演示了如何在 IBM WebSphere Process Server 中使用 SCA。
圖 1. WebSphere Process Server 中的 SCA
使用 WebSphere Process Server,集成開發(fā)人員可以擁有各種不同的現(xiàn)成實現(xiàn)技術,并且可以采用開放標準(如通過 Java 或者 WSDL)來公開接口。此外,SCA 還提供了一個客戶機編程模型,通過該模型,客戶機可以訪問服務組件。這使得開發(fā)人員可以繼續(xù)使用他們熟悉的各種技術(如 Enterprise JavaBeans? (EJB))進行開發(fā),并且使用 SCA 將這些組件連接在一起。
SCA 的另一個主要部分是它還定義了一個標準模型,用于定義組件之間的依賴項。因此,通過使用引用連接 SCA 組件,可以定義依賴項。
圖 2. 定義組件之間的依賴項
最后,SCA 定義了一個標準的部署模型,用于將組件打包到服務模塊。可以定義 SCA 組件以及與其相關聯(lián)的依賴項,并且將它們打包到部署單元。
圖 3. 與依賴項一起打包的組件
SCA 模塊并非只是另一種類型的包。在 WebSphere Process Server 中,SCA 服務模塊等同于一個 J2EE EAR 文件和許多其他 J2EE 子模塊。J2EE 元素(如 WAR 文件)可以與 SCA 模塊一起打包。非 SCA 構(gòu)件(JSP 以及其他構(gòu)件)也可以同 SCA 服務模塊打包在一起,這使得它們可以使用一種稱為獨立引用的特殊類型的引用,來通過 SCA 客戶機編程模型調(diào)用 SCA 服務。
圖 4. 用于非 SCA 構(gòu)件的獨立引用
SCA 與集成有著緊密的聯(lián)系;我們將上述引用作為一種定義 SCA 組件之間的依賴項的方式進行了描述。例如,我們可以定義對同一個模塊內(nèi)的另一個 SCA 組件的引用。當使用引用調(diào)用同一個模塊內(nèi)的服務組件時,數(shù)據(jù)通過引用進行傳遞。SCA 定義了調(diào)用組件或其他 SCA 服務(位于其他 SCA 模塊內(nèi))的方式。
用于模塊到模塊和模塊到外部服務調(diào)用的這兩種機制稱為導入和導出。
導入和導出是從模塊的角度表述的。模塊是一組執(zhí)行特定業(yè)務功能的自包含 (self-contained) 組件。
當模塊需要向另一個實體(外部服務或其他模塊)提供功能來調(diào)用業(yè)務功能時,它將導出該功能。導出使得可以通過多種不同的傳輸協(xié)議來使用此服務。導出與模塊內(nèi)的某個特定組件相關聯(lián)。
當模塊需要利用另一個實體(外部服務或模塊)的功能時,模塊將導入該功能。導入還提供了通過多種傳輸協(xié)議與服務提供者交互的功能。
圖 5 闡釋了這些概念。
圖 5. SCA 導入和導出
導入和導出是抽象概念。它們需要綁定到某一特定技術。WebSphere Process Server V6.0 中提供的綁定類型有:
- SCA(用于 SCA 模塊到模塊)
- Web 服務
- JMS
- 無狀態(tài)會話 Bean。
當通過導入和導出調(diào)用 SCA 組件時,參數(shù)通過值進行傳遞。
圖 6. SCA 導入和導出
連接 SCA 組件的網(wǎng)絡將大部分基礎結(jié)構(gòu)級別的代碼抽象出來。例如,我們可以將網(wǎng)絡定義為同步或異步,將操作定義為單向或請求-響應,我們也可以定義組件之間的事務行為。SCA 為您處理基礎結(jié)構(gòu)方面的細節(jié)。我們將在這一系列文章中對這些細節(jié)進行更詳細的描述。
導入和導出還可以綁定到其他技術,例如 JMS、Enterprise JavaBean 或者 Web 服務。這樣,Web 服務客戶機就可以調(diào)用 SCA 模塊,而 SCA 模塊就可以使用 SCA 編程模型調(diào)用現(xiàn)有的 Enterprise JavaBean。
圖 7. 使用其他技術的導入和導出
我們將在本系列的后續(xù)文章中討論導入和導出。
數(shù)據(jù)方面的情況如何?
SCA 向我們提供了一個用于定義業(yè)務服務的通用模型。服務數(shù)據(jù)對象 (SDO) 提供了一種用通用模型來表示數(shù)據(jù)的方法。可以將 SCA 組件組合在一起,并且通過傳遞 SDO 來以一種中立的方式相互交換數(shù)據(jù)。SDO 體系結(jié)構(gòu)中的基本概念是數(shù)據(jù)對象,它是用于存放基元類型的數(shù)據(jù)和/或其他數(shù)據(jù)對象的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)對象還存放對元數(shù)據(jù)的引用,元數(shù)據(jù)提供有關包含在數(shù)據(jù)對象中的數(shù)據(jù)的信息。
在 SDO 編程模型中,數(shù)據(jù)對象是以 commonj.sdo.DataObject Java 接口定義表示的。該接口包含方法定義,通過方法定義,客戶機可以獲取和設置與數(shù)據(jù)對象相關聯(lián)的屬性。SDO 體系結(jié)構(gòu)中的另一個重要概念是數(shù)據(jù)圖,它是封裝一組數(shù)據(jù)對象的結(jié)構(gòu)。對于包含在數(shù)據(jù)圖中的頂層數(shù)據(jù)對象,可以從根數(shù)據(jù)對象開始遍歷引用來到達所有子數(shù)據(jù)對象。數(shù)據(jù)圖中的另一個重要功能是更改摘要,用于記錄關于在處理過程中已經(jīng)更改的圖中的數(shù)據(jù)對象和屬性的信息。(有關 SDO 的詳細信息,請參閱參考資料。)
WebSphere Process Server 通過業(yè)務對象實現(xiàn) SDO 規(guī)范。SCA 組件可以通過傳遞業(yè)務對象來交換數(shù)據(jù),如圖 8 所示。
圖 8. WebSphere Process Server 業(yè)務對象
與 SDO 包裝在數(shù)據(jù)圖中一樣,業(yè)務圖用于包裝頂層業(yè)務對象,并且提供用來補充包含在圖中的數(shù)據(jù)的附加信息。具體來說,業(yè)務圖包括圖中數(shù)據(jù)的更改摘要(類似于 SDO 更改摘要信息)、事件摘要和謂詞信息(用于 EIS 系統(tǒng)之間的數(shù)據(jù)同步)。業(yè)務圖與 SDO 體系結(jié)構(gòu)中的數(shù)據(jù)圖的概念非常相似。然而,新增信息的事件摘要和謂詞部分沒有包含在 SDO 數(shù)據(jù)圖概念中。
SCA 101
既然我們已經(jīng)概括地介紹了 SCA,就可以通過一個示例來討論某些具體細節(jié)。在構(gòu)建示例的過程中,我們將對 IBM WebSphere Integration Developer 進行概述,您可以使用該工具來以可見的方式構(gòu)建和集成 SCA 組件。
概述
為了演示 SCA 和業(yè)務對象的各個方面,我們將討論與一個業(yè)務案例有關的這些概念。與所有開發(fā)工作一樣,開發(fā)周期必須從需求開始。該場景中的需求包括創(chuàng)建信用審批服務,該服務將接收關于申請者 (CreditApplication) 的信息,并通過信用等級 (CreditRating) 進行響應。
SCA 中最簡單的部分是服務組件。如前所述,服務組件是由一個接口和一個實現(xiàn)構(gòu)成的。用來“編碼”這些構(gòu)件的技術可以有所不同;在 WebSphere Process Server 中,接口可以是 Java 或者 WSDL。Java 接口可以是 Plain Old Java Interface (POJI),如下所示:
清單 1
public interface CreditRequest
{
public DataObject calulateCreditScore(DataObject creditApp)
throws ServiceBusinessException;
}
|
如果您使用 Java 實現(xiàn),則可以創(chuàng)建一個簡單的 POJO。下面是一個用作 SCA 實現(xiàn)的 POJO 的示例:
清單 2
public class CreditApprovalImpl implements CreditRequest {
public DataObject calulateCreditScore(DataObject creditApp) {
ServiceManager serviceManager = new ServiceManager();
BOFactory bof = (BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory");
DataObject creditRating = bof.create("http://CreditApproval", "CreditRating");
creditRating.setString("customerId", creditApp.getString("customerId"));
creditRating.setInt("creditScore", 750);
creditRating.setDouble("creditLimit", 10000d);
return creditRating;
}
}
|
在這個實現(xiàn)類中,我們使用 CreditApplication 輸入創(chuàng)建一個簡單的 CreditRating 業(yè)務對象,然后我們將該業(yè)務對象返回到調(diào)用程序。
服務組件是在服務組件定義語言(Service Component Definition Language,SCDL)文件中定義的。使用 SCDL 創(chuàng)建的組件文件與 EJB 部署描述符有些類似,這是因為它定義了接口、實現(xiàn)和 SCA 組件的多個服務質(zhì)量需求。上述 Java 類的 SCDL 文件如下所示:
清單 3
<?xml version="1.0" encoding="UTF-8"?>
<scdl:component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0"
xmlns:ns1="http://CreditApproval/CreditRequest"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0"
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0"
displayName="CreditApproval" name="CreditApproval">
<interfaces>
<interface xsi:type="java:JavaInterface" interface="CreditRequest " >
<method name="calulateCreditScore"/>
</interface>
</interfaces>
<implementation xsi:type="java:JavaImplementation" class=" CreditApprovalImpl"/>
</scdl:component>
|
類似地,我們可以使用 WSDL 表示接口,如下所示:
清單 4
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:bons1="http://CreditApproval"
xmlns:tns="http://CreditApproval/CreditRequest"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CreditRequest"
targetNamespace="http://CreditApproval/CreditRequest">
<wsdl:types>
<xsd:schema targetNamespace="http://CreditApproval/CreditRequest"
xmlns:bons1="http://CreditApproval"
xmlns:tns="http://CreditApproval/CreditRequest"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://CreditApproval"
schemaLocation="xsd-includes/http.CreditApproval.xsd"/>
<xsd:element name="calulateCreditScore">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditApp" nillable="true"
type="bons1:CreditApp"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="calulateCreditScoreResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditRating" nillable="true"
type="bons1:CreditRating"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="calulateCreditScoreRequestMsg">
<wsdl:part element="tns:calulateCreditScore"
name="calulateCreditScoreParameters"/>
</wsdl:message>
<wsdl:message name="calulateCreditScoreResponseMsg">
<wsdl:part element="tns:calulateCreditScoreResponse"
name="calulateCreditScoreResult"/>
</wsdl:message>
<wsdl:portType name="CreditRequest">
<wsdl:operation name="calulateCreditScore">
<wsdl:input message="tns:calulateCreditScoreRequestMsg"
name="calulateCreditScoreRequest"/>
<wsdl:output message="tns:calulateCreditScoreResponseMsg"
name="calulateCreditScoreResponse"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
|
實現(xiàn)類可能與之相同(唯一不同的是,它顯然沒有實現(xiàn)任何 Java 接口,因為它定義為 WSDL)。
我們的 SCDL 文件可以將接口綁定到 WSDL 文檔:
清單 5
<?xml version="1.0" encoding="UTF-8"?>
<scdl:component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0"
xmlns:ns1="http://CreditApproval/CreditRequest"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0"
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0"
displayName="CreditApproval" name="CreditApproval">
<interfaces>
<interface xsi:type="wsdl:WSDLPortType" portType="ns1:CreditRequest">
<method name="calulateCreditScore"/>
</interface>
</interfaces>
<implementation xsi:type="java:JavaImplementation" class="CreditApprovalImpl"/>
</scdl:component>
|
SCDL 用于描述 SCA 的組成部分,如模塊、引用、導入和導出。您將在本系列中看到它們的示例。SCDL 定義是由多個文件組成的。例如,我們將接口和實現(xiàn)的 SCDL 存儲在一個名為 CreditApproval.component 的文件中。引用可以包含在 CreditApproval.component 文件(內(nèi)聯(lián))中,也可以包含在 Module 根目錄下的一個單獨的 sca.references 文件中。所有獨立引用都將放置在 sca.references 文件中,如下所示。如前所述,同一個 SCA 模塊內(nèi)的非 SCA 構(gòu)件 (JSP) 可以使用獨立引用調(diào)用 SCA 組件。
清單 6
<?xml version="1.0" encoding="UTF-8"?>
<scdl:references xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:java="http://www.ibm.com/xmlns/prod/websphere/scdl/java/6.0.0"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0">
<reference name="CreditRequestPartner">
<interface xsi:type="java:JavaInterface" interface="approval.credit.credit.request.CreditRequest">
<method name="calulateCreditScore"/>
</interface>
<wire target="CreditApproval"/>
</reference>
</scdl:references>
|
在我們的示例中,我們將定義的第三個文件是 sca.module。該 SCDL 文件包含模塊的定義:
清單 7
<?xml version="1.0" encoding="UTF-8"?>
<scdl:module xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApproval"/>
|
雖然我們?yōu)榻M件定義了一個 WSDL 接口,但是請注意,我們能夠?qū)⒘硪粋€ Java 接口添加到獨立引用,并將其連接到我們的目標組件。通過這種方式,Java 客戶機可以使用一個簡單的 POJI 調(diào)用 SCA 組件。WebSphere Integration Developer 將提供在 Java 接口和 WSDL 接口之間轉(zhuǎn)換調(diào)用的選項。在創(chuàng)建了第一個 SCA 組件后,您將很快看到這樣一個示例。
在這一系列文章中,我們將看到 SCDL 如何定義其他 SCA 構(gòu)件(如服務引用、導入和導出)的示例。WebSphere Integration Developer 使用上述 SCDL 文件的命名約定,實際情況就是如此。在我們的示例中,在構(gòu)建第一個 SCA 組件時,您將使用 WebSphere Integration Developer。然而,SCA 應用程序也可以使用記事本進行構(gòu)建。
WebSphere Integration Developer 和 WebSphere Process Server
在本文中,您將使用 WebSphere Integration Developer 和 WebSphere Process Server 來構(gòu)建并運行 SCA 組件。
WebSphere Integration Developer 用于開發(fā)運行于 WebSphere Process Server V6 上的應用程序。WebSphere Integration Developer 基于 Eclipse 3.0 平臺,它為集成項目提供了基于角色的開發(fā)。您可以將 WebSphere Integration Developer 和 IBM WebSphere Business Modeler V6 與 IBM Rational? Application Developer V6 或 IBM Rational Software Architect V6 一起作為集成開發(fā)平臺。J2EE 開發(fā)人員、業(yè)務分析人員或集成開發(fā)人員可以使用基于其獨特角色的工具透視圖,這樣每個開發(fā)人員都可以將注意力集中在這些角色所需的編輯器和工具上,從而大大提高了工作效率。
WebSphere Process Server 是一個基于 WebSphere Application Server V6 的綜合集成平臺。WebSphere Process Server 用于在面向服務的體系結(jié)構(gòu)中執(zhí)行基于組件的業(yè)務集成應用程序。由于它基于 WebSphere Application Server 提供的 J2EE 1.4 基礎結(jié)構(gòu)和平臺服務,因此 WebSphere Process Server 包括諸如業(yè)務流程自動化之類的功能。
有關 WebSphere Integration Developer 和 WebSphere Process Server 的詳細信息,請參閱參考資料。
構(gòu)建第一個 SCA 項目
現(xiàn)在,您可以構(gòu)建第一個 SCA 項目了。在本例中,您將構(gòu)建一個簡單的信用審批組件。該組件接收一個具有 ID 和名稱的數(shù)據(jù)對象,然后返回另一個包含信用分數(shù)和信用額度的數(shù)據(jù)對象。下載本文所附的 zip 文件,并將其解壓縮到硬盤上。本指導假設您將 zip 文件解壓縮到 C: 盤上。
WebSphere Integration Developer V6.0 是一個靈活的開發(fā)環(huán)境,它為自底向上或自頂向下開發(fā) SCA 應用程序提供了工具和向?qū)А?/p>
為了創(chuàng)建信用審批服務,我們將研究自頂向下開發(fā)的各個方面。自頂向下開發(fā)過程的一般步驟大致如下:
- 創(chuàng)建 SCA 模塊。
- 創(chuàng)建業(yè)務對象。
- 定義服務接口。
- 生成組件并提供實現(xiàn)。
- 對 SCA 組件進行單元測試。
- 提供獨立引用。
- 使用簡單的 JSP 客戶機測試服務。
創(chuàng)建 SCA 模塊
首先,您需要創(chuàng)建一個 SCA 模塊。如前所述,SCA 模塊是 SCA 組件的打包構(gòu)造。
-
在 WebSphere Integration Developer 中打開一個空白工作區(qū)。(圖 9)
圖 9. 在 WebSphere Integration Developer 中打開一個空白工作區(qū)
-
關閉 Welcome 屏幕。
-
接下來,您需要創(chuàng)建一個新模塊。
-
在 WebSphere Integration Developer 工作臺中,打開業(yè)務集成透視圖。找到 Business Integration 視圖。
-
在 Business Integration 視圖內(nèi)單擊鼠標右鍵,然后選擇 New => Module。(圖 10)
圖 10. 創(chuàng)建新模塊
-
New Module 向?qū)摮霈F(xiàn)(圖 11)。將該模塊命名為 CreditApprovalSCAModule
。
圖 11. 創(chuàng)建新模塊
-
現(xiàn)在,Business Integration 視圖中應該顯示一個新項目。SCA 模塊是作為 SCDL 文件描述的。Business Integration 視圖向您展示了 SCA 模塊的邏輯視圖。如前所述,您可以打開 Physical Resource 視圖,來查看包含在 SCA 模塊中的物理資源。SCA 模塊的 SCDL 包含在名為 sca.module 的文件中。如果您使用文本編輯器打開該文件,應該看到以下內(nèi)容:
清單 8
<?xml version="1.0" encoding="UTF-8"?>
<scdl:module xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0" name="CreditApprovalSCAModule"/>
|
創(chuàng)建業(yè)務對象
對于創(chuàng)建接口或業(yè)務對象,沒有預先定義的任務順序;只需要在創(chuàng)建接口時簡單地創(chuàng)建業(yè)務對象即可。這里我們選擇在 Business Integration 視圖中創(chuàng)建業(yè)務對象。
在創(chuàng)建業(yè)務對象時,實際上您正在創(chuàng)建 XML 模式。業(yè)務對象作為標準的 XML 模式進行存儲。應用程序可以使用 SDO 編程模型和 XPath 訪問數(shù)據(jù)。
通過業(yè)務對象編輯器,我們可以創(chuàng)建信用審批服務將使用的業(yè)務對象定義。我們的服務需要兩個業(yè)務對象。
CreditApplication:包含計算信用等級所需的信用申請者的有關信息。信用應用程序業(yè)務對象 (CreditApplication) 包含三個屬性:
-
Customer Id:客戶的唯一標識符
-
First Name:客戶的名字
-
Last Name:客戶的姓氏
CreditRating:包含信用等級信息,如信用分數(shù)和信用額度。信用等級業(yè)務對象 (CreditRating) 包含三個屬性:
-
Credit Score:客戶基于先前歷史記錄的信用分數(shù)
-
Credit Limit:客戶可借貸的總金額。
-
我們首先創(chuàng)建請求業(yè)務對象,它用作 SCA 組件的輸入?yún)?shù)。
-
請確保 CreditApprovalSCAModule 已展開。右鍵單擊 Data Types,然后選擇 New => Business Object。(圖 12)
圖 12. 創(chuàng)建新業(yè)務對象
-
將業(yè)務對象命名為 CreditApplication
,如圖 13 所示。
圖 13. 定義業(yè)務對象
-
該業(yè)務對象應該在業(yè)務對象編輯器中打開。現(xiàn)在,Data Types 菜單下應該有 CreditApplication。(圖 14)
圖 14. 業(yè)務集成菜單
-
現(xiàn)在,我們將定義 CreditApplication 業(yè)務對象的屬性。
-
您可以通過選擇 Add Attribute 圖標添加屬性,如圖 15 所示。
圖 15. Add Attribute 圖標
-
輸入 customerId
作為屬性名稱,并接受缺省的 String 類型。(要更改類型,您只需選擇類型字段,并從下拉框中選擇類型。您需要為響應對象進行此操作。)
圖 16. 定義屬性
-
再添加兩個 String 屬性,并將其命名為 firstName
和 lastName
。這兩個屬性應該是字符串類型,如下所示。
圖 17. 定義屬性
-
該業(yè)務對象是使用標準的 XML 模式類型定義的。您可以使用 XML 編輯器打開該業(yè)務對象,以便進行查看。(通過右鍵單擊業(yè)務對象并選擇 Open with => 和您選擇的編輯器,您可以在文本編輯器中打開該業(yè)務對象。)
-
保存并關閉業(yè)務對象編輯器。
圖 18. 定義的業(yè)務對象
-
XML 模式應該類似于下面的代碼示例。
清單 9
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://CreditApprovalSCAModule">
<xsd:complexType name="CreditApplication">
<xsd:sequence>
<xsd:element minOccurs="0" name="customerId" type="xsd:string"/>
<xsd:element minOccurs="0" name="firstName" type="xsd:string"/>
<xsd:element minOccurs="0" name="lastName" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
|
-
現(xiàn)在,我們要創(chuàng)建第二個業(yè)務對象來表示響應。
-
按照上面同樣的步驟,創(chuàng)建另一個業(yè)務對象。該業(yè)務對象有三個字段:
- 字符串類型的 customerId
- 整數(shù)類型的 creditScore
- 雙精度類型的 creditLimit
-
如前所述,您可以通過選擇類型列更改類型,如圖 19 所示。
圖 19. 更改屬性類型
-
保存并關閉業(yè)務對象編輯器
現(xiàn)在,您已經(jīng)創(chuàng)建了兩個業(yè)務對象。
定義服務接口
現(xiàn)在,您可以創(chuàng)建 SCA 接口了。此外,信用審批服務是一個請求-響應服務,它接收信用應用程序并同時返回信用等級。服務接口定義服務客戶機和服務提供者之間的交互。
有多種創(chuàng)建接口的方式。如果您選擇 Java 接口,可以使用 WebSphere Integration Developer 中的 Java Eclipse 工具來進行創(chuàng)建。在我們的示例中,我們將在業(yè)務集成透視圖中創(chuàng)建 WSDL 接口。您可以使用 Assembly Editor 創(chuàng)建,也可以使用業(yè)務集成視圖創(chuàng)建。我們將使用后者。(稍后,我們將使用 Assembly Editor 創(chuàng)建實現(xiàn)。)
-
首先,我們將使用 Business Integration 視圖菜單創(chuàng)建接口。
-
右鍵單擊 Interfaces 菜單項,然后選擇 New => Interfaces,如圖 20 所示。
圖 20. 創(chuàng)建新接口
-
在 New Interface 菜單中,輸入名稱 CreditApproval
。(請記住出于演示的目的,在我們的示例中,我們使用的是缺省包和文件夾。您可以選擇一個文件夾,輕松地按功能對不同的接口進行分組。)
圖 21. 創(chuàng)建新接口
-
CreditApproval 接口是一個簡單的 WSDL 文件。WebSphere Integration Developer 附帶了一個簡單的 WSDL 編輯器,可以用來構(gòu)建接口。
-
在創(chuàng)建接口時,接口編輯器應該已經(jīng)打開。如果接口編輯器尚未打開,可以在業(yè)務集成視圖中雙擊接口,以將接口編輯器打開。
-
首先,我們要創(chuàng)建一個簡單的請求-響應操作。(您還可以創(chuàng)建用于異步調(diào)用的單向操作,但是現(xiàn)在,我們只創(chuàng)建簡單的同步請求。)單擊 Add Request Response Operation 圖標,如圖 22 所示。
圖 22. Add Request Response Operation 圖標
-
將在編輯器中創(chuàng)建一個操作。將該操作命名為 calculateCreditRating
。(圖 23)
圖 23. 定義操作
-
現(xiàn)在我們需要定義參數(shù)。請記住,我們創(chuàng)建了兩個業(yè)務對象,一個用于輸入,另一個用于輸出。在創(chuàng)建操作后,選擇 Add Input 圖標,如圖 24 所示。
圖 24. Add Input 圖標
-
將輸入命名為 CreditApplication
。
-
選擇 Type 列并找到 CreditApplicaiton 業(yè)務對象。您可以看到,業(yè)務對象現(xiàn)在是一個有效類型,可以用于構(gòu)建接口,如圖 25 所示。(在這里你可以選擇創(chuàng)建新業(yè)務對象。)
圖 25. 新業(yè)務對象現(xiàn)在是一個有效類型
-
接下來,選擇 Add Output 圖標,如圖 26 所示。
圖 26. Add Output 圖標
-
選擇 CreditRating 作為類型,類似于選擇輸入的類型。
圖 27. 定義輸出
-
保存并關閉接口編輯器。
-
如果您希望檢查 WSDL 文件,可以在 Physical Resources 視圖中右鍵單擊 CreditApproval.wsdl 文件,然后使用文本編輯器打開該文件。(圖 28)
圖 28. 查看 WSDL 文件
WSDL 文件應該類似于下面的代碼示例。
清單 10
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:bons1="http://CreditApprovalSCAModule"
xmlns:tns="http://CreditApprovalSCAModule/CreditApproval"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="CreditApproval" targetNamespace="http://CreditApprovalSCAModule/CreditApproval">
<wsdl:types>
<xsd:schema targetNamespace="http://CreditApprovalSCAModule/CreditApproval"
xmlns:bons1="http://CreditApprovalSCAModule"
xmlns:tns="http://CreditApprovalSCAModule/CreditApproval"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://CreditApprovalSCAModule"
schemaLocation="xsd-includes/http.CreditApprovalSCAModule.xsd"/>
<xsd:element name="calculateCreditRating">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditApplication" nillable="true"
type="bons1:CreditApplication"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="calculateCreditRatingResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CreditRating" nillable="true"
type="bons1:CreditRating"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="calculateCreditRatingRequestMsg">
<wsdl:part element="tns:calculateCreditRating"
name="calculateCreditRatingParameters"/>
</wsdl:message>
<wsdl:message name="calculateCreditRatingResponseMsg">
<wsdl:part element="tns:calculateCreditRatingResponse"
name="calculateCreditRatingResult"/>
</wsdl:message>
<wsdl:portType name="CreditApproval">
<wsdl:operation name="calculateCreditRating">
<wsdl:input message="tns:calculateCreditRatingRequestMsg"
name="calculateCreditRatingRequest"/>
<wsdl:output message="tns:calculateCreditRatingResponseMsg"
name="calculateCreditRatingResponse"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
|
生成組件并提供實現(xiàn)
現(xiàn)在,我們可以創(chuàng)建 SCA 實現(xiàn)了。此時,我們已經(jīng)創(chuàng)建了標準的接口和業(yè)務對象。現(xiàn)在我們要定義 SCA 組件。您將使用 SCA Assembly Editor 來完成此操作。
-
首先,我們要定義 SCA 組件。
-
通過雙擊 CreditApprovalSCAModule 菜單項,打開 SCA Assembly Editor,如圖 29 所示。
圖 29. 打開 SCA Assembly Editor
-
SCA Assembly Editor 有一個面板,可以用于創(chuàng)建 SCA 構(gòu)件。您也可以從各種視圖中拖動某些構(gòu)件。只需將 CreditApproval 接口拖至 Assembly Editor,如圖 30 所示。(或者,您也可以從面板拖動 Java 組件,然后將其與接口相關聯(lián)。)
圖 30. 將接口拖至 Assembly Editor
-
將出現(xiàn)一個文本框。選擇 Component with No Implementation Type,如圖 31 所示。
圖 31. 組件創(chuàng)建文本框
-
現(xiàn)在,您應該在 Assembly Editor 上看到一個名為 Component1 的 SCA 組件。(圖 32)
圖 32. SCA 組件圖標
-
通過選擇組件并鍵入名稱,您可以更改名稱;或者可以使用屬性編輯器更改名稱,如圖 33 所示。將顯示名稱更改為 CreditApproval
。名稱字段應該自動更改。
圖 33. 更改組件名稱
-
現(xiàn)在,我們的 SCA 組件具有接口,但沒有實現(xiàn)。現(xiàn)在我們要使用 Assembly Editor 生成實現(xiàn)。
-
通過在 Assembly Editor 中右鍵單擊組件并選擇 Generate Implementation => Java,生成一個框架實現(xiàn)。(圖 34)
圖 34. 生成框架實現(xiàn)
-
新 Java 實現(xiàn)應該在 Java 編輯器中打開;您將看到 calculateCreditRating。下載文件中提供了簡單的代碼段,位置為 C:\SCA_ArticleSeries\Part1\CodeSnippet1.txt。方法如下所示。
清單 11
public DataObject calculateCreditRating(DataObject creditApplication) {
// Create and return a credit rating object.
System.out.println("********* credit approval service invoked ******");
ServiceManager serviceManager = new ServiceManager();
BOFactory bof = (BOFactory)serviceManager.locateService("com/ibm/websphere/bo/BOFactory");
System.out.println("********* BOFactory created ******");
DataObject creditRating = bof.create("http://CreditApproval", "CreditRating");
System.out.println("********* credit rating object created ******");
creditRating.setString("customerId", creditApplication.getString("customerId"));
creditRating.setInt("creditScore", 750);
creditRating.setDouble("creditLimit", 10000d);
System.out.println("********* returning credit rating object ******");
return creditRating;
}
|
-
這些代碼使用 SCA 服務管理器查找業(yè)務對象工廠 (Business Object Factory),后者用于從 XML 模式中創(chuàng)建業(yè)務對象。出于演示的目的,我們創(chuàng)建響應數(shù)據(jù)對象,并返回硬編碼的數(shù)據(jù)。
-
如果您粘貼代碼,則可能出現(xiàn)一些編譯錯誤。通過右鍵單擊編輯器并選擇 Source => Organize Imports,您可以更正這些錯誤,如圖 35 所示。
圖 35. 更正錯誤
-
保存并關閉 Java 文件,但是 Assembly Editor 保持打開狀態(tài)。
對 SCA 組件進行單元測試
WebSphere Integration Developer 提供了使用單元測試工具對組件進行單元測試的功能。根據(jù) SCA 實現(xiàn)的類型,您可以在 J2SE 環(huán)境中測試 SCA 組件,通過該環(huán)境,可以在沒有完整的應用程序服務器的情況下測試組件;當然,這在很大程度上取決于您具有的組件的類型。可以在 J2SE 環(huán)境中輕松地對 Java 實現(xiàn)進行測試,但是由 BPEL 流程實現(xiàn)的 SCA 組件需要 BPEL 引擎(如 WebSphere Process Server)。在我們的示例中,我們將使用測試組件功能來測試 SCA 組件。
要啟動測試組件功能,請執(zhí)行以下步驟:
-
在 SCA Assembly Editor 中右鍵單擊 CreditApproval 組件,然后選擇 Test Component。(圖 36)
圖 36. 啟動測試組件功能
-
這將啟動測試組件編輯器。在該工具的右側(cè),輸入測試數(shù)據(jù),如圖 37 所示,然后單擊 Continue。
圖 37. 輸入測試數(shù)據(jù)
-
將顯示可用的運行時列表。選擇 Eclipse 1.4 JVM,然后單擊 Finish。(圖 38)
圖 38. 運行時部署位置
-
要開始測試,請選擇 Return 項,如圖 39 所示。監(jiān)視 Events 窗口以查看流程。
圖 39. Events 窗口
-
您將在右側(cè)看到結(jié)果。(圖 40)
圖 40. 單元測試結(jié)果
創(chuàng)建 SCA 客戶機 Web 應用程序并在 WebSphere Process Server 中進行測試
-
要讓打包在同一 SCA 部署中的非 SCA 組件調(diào)用 SCA 組件,我們需要創(chuàng)建獨立引用:
-
在 SCA Assembly Editor 中,請選擇面板中 Import 圖標旁邊的 arrow。這將打開一個更小的子菜單。選擇 Standalone references 圖標,并將其拖至 Assembly Editor 中的任何位置,如圖 41 所示。
圖 41. 創(chuàng)建獨立引用
-
單擊 Stand-alone References 框的內(nèi)部(而非文本),并將其拖至 Credit Approval 組件,如圖 42 所示。
圖 42. 創(chuàng)建匹配引用
-
單擊 OK,創(chuàng)建匹配引用。(圖 43)
圖 43. 創(chuàng)建匹配引用
-
下一文本框?qū)⑾蚰峁┥?Java 接口的選項。請記住,您創(chuàng)建了 WSDL 接口。然而,WebSphere Integration Developer 要生成等效的 Java 接口,以使 Java 客戶機使用 SCA API 交互。選擇 Yes。(圖 44)
圖 44. 接口轉(zhuǎn)換驗證
-
有了獨立引用后,現(xiàn)在我們可以在同一模塊的非 SCA 組件中調(diào)用 SCA 組件。請記住,SCA 模塊是由 EAR 文件實現(xiàn)的,因此您可以將其他 J2EE 組件添加到 SCA 模塊。在我們的示例中,我們要導入具有 JSP 文件的現(xiàn)有 WAR 文件。WAR 文件將是基礎 EAR 文件的一部分。
-
選擇 File => Import,調(diào)出 Import 向?qū)А_x擇 WAR file,然后單擊 Next。(圖 45)
圖 45. 從非 SCA 組件中調(diào)用 SCA 組件
-
選擇 C:\SCA_ArticleSeries\Part1\CreditApprovalClient.war。取消選擇 Add module to an EAR Project。
圖 46. 導入 WAR 文件
-
選擇 Yes,以轉(zhuǎn)到 Web 透視圖。(圖 47)
圖 47. 轉(zhuǎn)到 Web 透視圖
-
打開 JSP 文件,以檢查代碼。您將在 Dynamic Web Projects 目錄下找到該文件,如圖 48 所示。JSP 稱為 creditApprovalClient.jsp。
圖 48. Dynamic Web Projects 目錄
-
我們使用簡單的 JSP 接收輸入并使用 SCA API 調(diào)用 SCA 組件。(請記住,為了使用 MVC,該 JSP 遵循最佳實踐)。
-
SCA 具有 Dependency Editor,通過該編輯器,可以將不同的包添加到 SCA 模塊:
-
通過右鍵單擊 CreditApprovalSCAModule 并選擇 Open Dependency Editor,打開 Dependency Editor。(圖 49)
圖 49. 打開 Dependency Editor
-
展開 J2EE 部分,然后單擊 Add 按鈕。(圖 50)
圖 50. 配置依賴項
-
選擇 CreditApprovalClient Web 項目,如圖 51 所示。
圖 51. 選擇 Web 項目
-
請確保未選中 On Build Path。(Build Path 將該組件添加到 SCA 模塊的類路徑。在我們的示例中,我們需要使 WAR 文件依賴于 SCA 模塊。)保存 Dependency Editor。這使得 WAR 文件成為 EAR 文件的一部分。
圖 52. 設置依賴項
-
要讓 Web 項目知道 SCA Java 接口,可以右鍵單擊 Web 項目并選擇 Properties。
-
轉(zhuǎn)到 Java JAR Dependencies 并選擇 CreditApprovalSCAModuleEJBClient.jar,它是在下面生成的 EJB 客戶機 JAR 文件。(圖 53)
圖 53. 設置依賴項
-
關閉編輯器。此時,您可以選擇執(zhí)行整體構(gòu)建。這可能沒有必要,但我們總是喜歡在部署前進行整體構(gòu)建。如果您有自動構(gòu)建,可以進行清理,如圖 54 所示。
圖 54. 用于自動構(gòu)建的清理
-
現(xiàn)在,我們可以在 WebSphere Process Server 上部署并測試我們的 SCA 組件和 Web 客戶機了。請記住,我們的 SCA 模塊是由 J2EE 應用程序?qū)崿F(xiàn)的。您可以轉(zhuǎn)到 J2EE 透視圖來查看構(gòu)件。請記住,它們是生成的構(gòu)件。(我們以后將在這一系列文章中進行介紹。)
圖 55. J2EE 透視圖
-
轉(zhuǎn)到 Business Integration 透視圖底部的 Servers 視圖。右鍵單擊 WebSphere Process Server,然后選擇 Start,如圖 56 所示。
圖 56. 啟動 WebSphere Process Server
-
等待服務器啟動。檢查控制臺并等待圖 57 中所示的消息。
圖 57. WebSphere Process Server 啟動消息
-
再次右鍵單擊服務器并選擇 Add and remove projects。(圖 58)
圖 58. 添加和刪除項目
-
選擇 CreditApprovalSCAModuleAdd,然后選擇 Add,如圖 59 所示。這會將其移到右側(cè)的 Configured projects 框中。
圖 59. 在服務器上配置項目
-
監(jiān)視右下角的進度,等待部署應用程序。(圖 60)
圖 60. 項目部署監(jiān)視器
-
在控制臺驗證 CreditApporvalSCAModuleApp 已經(jīng)啟動。(圖 61)
圖 61. 管理控制臺消息
-
轉(zhuǎn)到 Web 透視圖。右鍵單擊 JSP,然后選擇 Run => Run on Server,如圖 62 所示。
圖 62. 運行應用程序
-
選擇現(xiàn)有的 WebSphere Process Server,接著選擇 Set server as project default,然后單擊 Finish。(圖 63)
圖 63. 設置服務器
-
當應用程序執(zhí)行時,輸入圖 64 中所示的應用程序測試數(shù)據(jù)。
圖 64. 輸入 SCA 應用程序測試數(shù)據(jù)
-
您應該獲得圖 65 所示的結(jié)果。
圖 65. SCA 應用程序測試結(jié)果
-
關閉瀏覽器并停止服務器。
祝賀您!您已經(jīng)創(chuàng)建并測試了第一個 SCA 組件!
結(jié)束語
服務組件體系結(jié)構(gòu) (SCA) 是面向服務的體系結(jié)構(gòu) (SOA) 中的一個主要變化。SCA 向我們提供了 SOA 的編程模型,并將在今后作為集成的基礎。請繼續(xù)關注本系列的后續(xù)文章,我們將研究特定 SCA 功能的細節(jié)以及它們可給您的應用程序帶來的好處。