隨著 IBM? WebSphere Integration Developer 和 WebSphere Process Server 的發(fā)布,出現(xiàn)了一種用于構(gòu)建面向服務(wù)的體系結(jié)構(gòu) (SOA) 的新編程范式,稱為服務(wù)組件體系結(jié)構(gòu),它是為在 SOA 中構(gòu)建和組裝業(yè)務(wù)解決方案而專門設(shè)計的一個新編程模型,旨在集成和組合服務(wù)。
摘自 IBM WebSphere 開發(fā)者技術(shù)期刊。
引言
您可能認(rèn)為,這太棒了,又出現(xiàn)了一個編程模型,但事實并非如此。Web 服務(wù)怎么樣了?Enterprise JavaBeans 發(fā)生了什么?服務(wù)組件體系結(jié)構(gòu) (SCA) 并非要替換任何現(xiàn)有的編程模型或者與其抗衡。相反,SCA 向您提供一個以與技術(shù)無關(guān)的方式定義接口、實現(xiàn)和引用的模型,從而使您能夠?qū)⑦@些元素綁定到所選擇的某一技術(shù)的特定實現(xiàn)。
例如,我們可以用 Java 定義我們的接口,將我們的實現(xiàn)作為 BPEL 流程加以應(yīng)用,或者將接口作為一個 WSDL 文檔,而且我們的實現(xiàn)可以是一個 Java? 類。圖 1 演示了如何在 IBM WebSphere Process Server 中使用 SCA。
圖 1. WebSphere Process Server 中的 SCA
使用 WebSphere Process Server,集成開發(fā)人員可以擁有各種不同的現(xiàn)成實現(xiàn)技術(shù),并且可以采用開放標(biāo)準(zhǔn)(如通過 Java 或者 WSDL)來公開接口。此外,SCA 還提供了一個客戶機(jī)編程模型,通過該模型,客戶機(jī)可以訪問服務(wù)組件。這使得開發(fā)人員可以繼續(xù)使用他們熟悉的各種技術(shù)(如 Enterprise JavaBeans? (EJB))進(jìn)行開發(fā),并且使用 SCA 將這些組件連接在一起。
SCA 的另一個主要部分是它還定義了一個標(biāo)準(zhǔn)模型,用于定義組件之間的依賴項。因此,通過使用引用連接 SCA 組件,可以定義依賴項。
圖 2. 定義組件之間的依賴項
最后,SCA 定義了一個標(biāo)準(zhǔn)的部署模型,用于將組件打包到服務(wù)模塊。可以定義 SCA 組件以及與其相關(guān)聯(lián)的依賴項,并且將它們打包到部署單元。
圖 3. 與依賴項一起打包的組件
SCA 模塊并非只是另一種類型的包。在 WebSphere Process Server 中,SCA 服務(wù)模塊等同于一個 J2EE EAR 文件和許多其他 J2EE 子模塊。J2EE 元素(如 WAR 文件)可以與 SCA 模塊一起打包。非 SCA 構(gòu)件(JSP 以及其他構(gòu)件)也可以同 SCA 服務(wù)模塊打包在一起,這使得它們可以使用一種稱為獨(dú)立引用的特殊類型的引用,來通過 SCA 客戶機(jī)編程模型調(diào)用 SCA 服務(wù)。
圖 4. 用于非 SCA 構(gòu)件的獨(dú)立引用
SCA 與集成有著緊密的聯(lián)系;我們將上述引用作為一種定義 SCA 組件之間的依賴項的方式進(jìn)行了描述。例如,我們可以定義對同一個模塊內(nèi)的另一個 SCA 組件的引用。當(dāng)使用引用調(diào)用同一個模塊內(nèi)的服務(wù)組件時,數(shù)據(jù)通過引用進(jìn)行傳遞。SCA 定義了調(diào)用組件或其他 SCA 服務(wù)(位于其他 SCA 模塊內(nèi))的方式。
用于模塊到模塊和模塊到外部服務(wù)調(diào)用的這兩種機(jī)制稱為導(dǎo)入和導(dǎo)出。
導(dǎo)入和導(dǎo)出是從模塊的角度表述的。模塊是一組執(zhí)行特定業(yè)務(wù)功能的自包含 (self-contained) 組件。
當(dāng)模塊需要向另一個實體(外部服務(wù)或其他模塊)提供功能來調(diào)用業(yè)務(wù)功能時,它將導(dǎo)出該功能。導(dǎo)出使得可以通過多種不同的傳輸協(xié)議來使用此服務(wù)。導(dǎo)出與模塊內(nèi)的某個特定組件相關(guān)聯(lián)。
當(dāng)模塊需要利用另一個實體(外部服務(wù)或模塊)的功能時,模塊將導(dǎo)入該功能。導(dǎo)入還提供了通過多種傳輸協(xié)議與服務(wù)提供者交互的功能。
圖 5 闡釋了這些概念。
圖 5. SCA 導(dǎo)入和導(dǎo)出
導(dǎo)入和導(dǎo)出是抽象概念。它們需要綁定到某一特定技術(shù)。WebSphere Process Server V6.0 中提供的綁定類型有:
- SCA(用于 SCA 模塊到模塊)
- Web 服務(wù)
- JMS
- 無狀態(tài)會話 Bean。
當(dāng)通過導(dǎo)入和導(dǎo)出調(diào)用 SCA 組件時,參數(shù)通過值進(jìn)行傳遞。
圖 6. SCA 導(dǎo)入和導(dǎo)出
連接 SCA 組件的網(wǎng)絡(luò)將大部分基礎(chǔ)結(jié)構(gòu)級別的代碼抽象出來。例如,我們可以將網(wǎng)絡(luò)定義為同步或異步,將操作定義為單向或請求-響應(yīng),我們也可以定義組件之間的事務(wù)行為。SCA 為您處理基礎(chǔ)結(jié)構(gòu)方面的細(xì)節(jié)。我們將在這一系列文章中對這些細(xì)節(jié)進(jìn)行更詳細(xì)的描述。
導(dǎo)入和導(dǎo)出還可以綁定到其他技術(shù),例如 JMS、Enterprise JavaBean 或者 Web 服務(wù)。這樣,Web 服務(wù)客戶機(jī)就可以調(diào)用 SCA 模塊,而 SCA 模塊就可以使用 SCA 編程模型調(diào)用現(xiàn)有的 Enterprise JavaBean。
圖 7. 使用其他技術(shù)的導(dǎo)入和導(dǎo)出
我們將在本系列的后續(xù)文章中討論導(dǎo)入和導(dǎo)出。
數(shù)據(jù)方面的情況如何?
SCA 向我們提供了一個用于定義業(yè)務(wù)服務(wù)的通用模型。服務(wù)數(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ù)提供有關(guān)包含在數(shù)據(jù)對象中的數(shù)據(jù)的信息。
在 SDO 編程模型中,數(shù)據(jù)對象是以 commonj.sdo.DataObject Java 接口定義表示的。該接口包含方法定義,通過方法定義,客戶機(jī)可以獲取和設(shè)置與數(shù)據(jù)對象相關(guān)聯(lián)的屬性。SDO 體系結(jié)構(gòu)中的另一個重要概念是數(shù)據(jù)圖,它是封裝一組數(shù)據(jù)對象的結(jié)構(gòu)。對于包含在數(shù)據(jù)圖中的頂層數(shù)據(jù)對象,可以從根數(shù)據(jù)對象開始遍歷引用來到達(dá)所有子數(shù)據(jù)對象。數(shù)據(jù)圖中的另一個重要功能是更改摘要,用于記錄關(guān)于在處理過程中已經(jīng)更改的圖中的數(shù)據(jù)對象和屬性的信息。(有關(guān) SDO 的詳細(xì)信息,請參閱參考資料。)
WebSphere Process Server 通過業(yè)務(wù)對象實現(xiàn) SDO 規(guī)范。SCA 組件可以通過傳遞業(yè)務(wù)對象來交換數(shù)據(jù),如圖 8 所示。
圖 8. WebSphere Process Server 業(yè)務(wù)對象
與 SDO 包裝在數(shù)據(jù)圖中一樣,業(yè)務(wù)圖用于包裝頂層業(yè)務(wù)對象,并且提供用來補(bǔ)充包含在圖中的數(shù)據(jù)的附加信息。具體來說,業(yè)務(wù)圖包括圖中數(shù)據(jù)的更改摘要(類似于 SDO 更改摘要信息)、事件摘要和謂詞信息(用于 EIS 系統(tǒng)之間的數(shù)據(jù)同步)。業(yè)務(wù)圖與 SDO 體系結(jié)構(gòu)中的數(shù)據(jù)圖的概念非常相似。然而,新增信息的事件摘要和謂詞部分沒有包含在 SDO 數(shù)據(jù)圖概念中。
SCA 101
既然我們已經(jīng)概括地介紹了 SCA,就可以通過一個示例來討論某些具體細(xì)節(jié)。在構(gòu)建示例的過程中,我們將對 IBM WebSphere Integration Developer 進(jìn)行概述,您可以使用該工具來以可見的方式構(gòu)建和集成 SCA 組件。
概述
為了演示 SCA 和業(yè)務(wù)對象的各個方面,我們將討論與一個業(yè)務(wù)案例有關(guān)的這些概念。與所有開發(fā)工作一樣,開發(fā)周期必須從需求開始。該場景中的需求包括創(chuàng)建信用審批服務(wù),該服務(wù)將接收關(guān)于申請者 (CreditApplication) 的信息,并通過信用等級 (CreditRating) 進(jìn)行響應(yīng)。
SCA 中最簡單的部分是服務(wù)組件。如前所述,服務(wù)組件是由一個接口和一個實現(xiàn)構(gòu)成的。用來“編碼”這些構(gòu)件的技術(shù)可以有所不同;在 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è)務(wù)對象,然后我們將該業(yè)務(wù)對象返回到調(diào)用程序。
服務(wù)組件是在服務(wù)組件定義語言(Service Component Definition Language,SCDL)文件中定義的。使用 SCDL 創(chuàng)建的組件文件與 EJB 部署描述符有些類似,這是因為它定義了接口、實現(xiàn)和 SCA 組件的多個服務(wù)質(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 的組成部分,如模塊、引用、導(dǎo)入和導(dǎo)出。您將在本系列中看到它們的示例。SCDL 定義是由多個文件組成的。例如,我們將接口和實現(xiàn)的 SCDL 存儲在一個名為 CreditApproval.component 的文件中。引用可以包含在 CreditApproval.component 文件(內(nèi)聯(lián))中,也可以包含在 Module 根目錄下的一個單獨(dú)的 sca.references 文件中。所有獨(dú)立引用都將放置在 sca.references 文件中,如下所示。如前所述,同一個 SCA 模塊內(nèi)的非 SCA 構(gòu)件 (JSP) 可以使用獨(dú)立引用調(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 接口添加到獨(dú)立引用,并將其連接到我們的目標(biāo)組件。通過這種方式,Java 客戶機(jī)可以使用一個簡單的 POJI 調(diào)用 SCA 組件。WebSphere Integration Developer 將提供在 Java 接口和 WSDL 接口之間轉(zhuǎn)換調(diào)用的選項。在創(chuàng)建了第一個 SCA 組件后,您將很快看到這樣一個示例。
在這一系列文章中,我們將看到 SCDL 如何定義其他 SCA 構(gòu)件(如服務(wù)引用、導(dǎo)入和導(dǎo)出)的示例。WebSphere Integration Developer 使用上述 SCDL 文件的命名約定,實際情況就是如此。在我們的示例中,在構(gòu)建第一個 SCA 組件時,您將使用 WebSphere Integration Developer。然而,SCA 應(yīng)用程序也可以使用記事本進(jìn)行構(gòu)建。
WebSphere Integration Developer 和 WebSphere Process Server
在本文中,您將使用 WebSphere Integration Developer 和 WebSphere Process Server 來構(gòu)建并運(yùn)行 SCA 組件。
WebSphere Integration Developer 用于開發(fā)運(yùn)行于 WebSphere Process Server V6 上的應(yīng)用程序。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è)務(wù)分析人員或集成開發(fā)人員可以使用基于其獨(dú)特角色的工具透視圖,這樣每個開發(fā)人員都可以將注意力集中在這些角色所需的編輯器和工具上,從而大大提高了工作效率。
WebSphere Process Server 是一個基于 WebSphere Application Server V6 的綜合集成平臺。WebSphere Process Server 用于在面向服務(wù)的體系結(jié)構(gòu)中執(zhí)行基于組件的業(yè)務(wù)集成應(yīng)用程序。由于它基于 WebSphere Application Server 提供的 J2EE 1.4 基礎(chǔ)結(jié)構(gòu)和平臺服務(wù),因此 WebSphere Process Server 包括諸如業(yè)務(wù)流程自動化之類的功能。
有關(guān) WebSphere Integration Developer 和 WebSphere Process Server 的詳細(xì)信息,請參閱參考資料。
構(gòu)建第一個 SCA 項目
現(xiàn)在,您可以構(gòu)建第一個 SCA 項目了。在本例中,您將構(gòu)建一個簡單的信用審批組件。該組件接收一個具有 ID 和名稱的數(shù)據(jù)對象,然后返回另一個包含信用分?jǐn)?shù)和信用額度的數(shù)據(jù)對象。下載本文所附的 zip 文件,并將其解壓縮到硬盤上。本指導(dǎo)假設(shè)您將 zip 文件解壓縮到 C: 盤上。
WebSphere Integration Developer V6.0 是一個靈活的開發(fā)環(huán)境,它為自底向上或自頂向下開發(fā) SCA 應(yīng)用程序提供了工具和向?qū)А?/p>
為了創(chuàng)建信用審批服務(wù),我們將研究自頂向下開發(fā)的各個方面。自頂向下開發(fā)過程的一般步驟大致如下:
- 創(chuàng)建 SCA 模塊。
- 創(chuàng)建業(yè)務(wù)對象。
- 定義服務(wù)接口。
- 生成組件并提供實現(xiàn)。
- 對 SCA 組件進(jìn)行單元測試。
- 提供獨(dú)立引用。
- 使用簡單的 JSP 客戶機(jī)測試服務(wù)。
創(chuàng)建 SCA 模塊
首先,您需要創(chuàng)建一個 SCA 模塊。如前所述,SCA 模塊是 SCA 組件的打包構(gòu)造。
-
在 WebSphere Integration Developer 中打開一個空白工作區(qū)。(圖 9)
圖 9. 在 WebSphere Integration Developer 中打開一個空白工作區(qū)
-
關(guān)閉 Welcome 屏幕。
-
接下來,您需要創(chuàng)建一個新模塊。
-
在 WebSphere Integration Developer 工作臺中,打開業(yè)務(wù)集成透視圖。找到 Business Integration 視圖。
-
在 Business Integration 視圖內(nèi)單擊鼠標(biāo)右鍵,然后選擇 New => Module。(圖 10)
圖 10. 創(chuàng)建新模塊
-
New Module 向?qū)?yīng)該出現(xiàn)(圖 11)。將該模塊命名為 CreditApprovalSCAModule
。
圖 11. 創(chuàng)建新模塊
-
現(xiàn)在,Business Integration 視圖中應(yīng)該顯示一個新項目。SCA 模塊是作為 SCDL 文件描述的。Business Integration 視圖向您展示了 SCA 模塊的邏輯視圖。如前所述,您可以打開 Physical Resource 視圖,來查看包含在 SCA 模塊中的物理資源。SCA 模塊的 SCDL 包含在名為 sca.module 的文件中。如果您使用文本編輯器打開該文件,應(yīng)該看到以下內(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è)務(wù)對象
對于創(chuàng)建接口或業(yè)務(wù)對象,沒有預(yù)先定義的任務(wù)順序;只需要在創(chuàng)建接口時簡單地創(chuàng)建業(yè)務(wù)對象即可。這里我們選擇在 Business Integration 視圖中創(chuàng)建業(yè)務(wù)對象。
在創(chuàng)建業(yè)務(wù)對象時,實際上您正在創(chuàng)建 XML 模式。業(yè)務(wù)對象作為標(biāo)準(zhǔn)的 XML 模式進(jìn)行存儲。應(yīng)用程序可以使用 SDO 編程模型和 XPath 訪問數(shù)據(jù)。
通過業(yè)務(wù)對象編輯器,我們可以創(chuàng)建信用審批服務(wù)將使用的業(yè)務(wù)對象定義。我們的服務(wù)需要兩個業(yè)務(wù)對象。
CreditApplication:包含計算信用等級所需的信用申請者的有關(guān)信息。信用應(yīng)用程序業(yè)務(wù)對象 (CreditApplication) 包含三個屬性:
-
Customer Id:客戶的唯一標(biāo)識符
-
First Name:客戶的名字
-
Last Name:客戶的姓氏
CreditRating:包含信用等級信息,如信用分?jǐn)?shù)和信用額度。信用等級業(yè)務(wù)對象 (CreditRating) 包含三個屬性:
-
Credit Score:客戶基于先前歷史記錄的信用分?jǐn)?shù)
-
Credit Limit:客戶可借貸的總金額。
-
我們首先創(chuàng)建請求業(yè)務(wù)對象,它用作 SCA 組件的輸入?yún)?shù)。
-
請確保 CreditApprovalSCAModule 已展開。右鍵單擊 Data Types,然后選擇 New => Business Object。(圖 12)
圖 12. 創(chuàng)建新業(yè)務(wù)對象
-
將業(yè)務(wù)對象命名為 CreditApplication
,如圖 13 所示。
圖 13. 定義業(yè)務(wù)對象
-
該業(yè)務(wù)對象應(yīng)該在業(yè)務(wù)對象編輯器中打開。現(xiàn)在,Data Types 菜單下應(yīng)該有 CreditApplication。(圖 14)
圖 14. 業(yè)務(wù)集成菜單
-
現(xiàn)在,我們將定義 CreditApplication 業(yè)務(wù)對象的屬性。
-
您可以通過選擇 Add Attribute 圖標(biāo)添加屬性,如圖 15 所示。
圖 15. Add Attribute 圖標(biāo)
-
輸入 customerId
作為屬性名稱,并接受缺省的 String 類型。(要更改類型,您只需選擇類型字段,并從下拉框中選擇類型。您需要為響應(yīng)對象進(jìn)行此操作。)
圖 16. 定義屬性
-
再添加兩個 String 屬性,并將其命名為 firstName
和 lastName
。這兩個屬性應(yīng)該是字符串類型,如下所示。
圖 17. 定義屬性
-
該業(yè)務(wù)對象是使用標(biāo)準(zhǔn)的 XML 模式類型定義的。您可以使用 XML 編輯器打開該業(yè)務(wù)對象,以便進(jìn)行查看。(通過右鍵單擊業(yè)務(wù)對象并選擇 Open with => 和您選擇的編輯器,您可以在文本編輯器中打開該業(yè)務(wù)對象。)
-
保存并關(guān)閉業(yè)務(wù)對象編輯器。
圖 18. 定義的業(yè)務(wù)對象
-
XML 模式應(yīng)該類似于下面的代碼示例。
清單 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è)務(wù)對象來表示響應(yīng)。
-
按照上面同樣的步驟,創(chuàng)建另一個業(yè)務(wù)對象。該業(yè)務(wù)對象有三個字段:
- 字符串類型的 customerId
- 整數(shù)類型的 creditScore
- 雙精度類型的 creditLimit
-
如前所述,您可以通過選擇類型列更改類型,如圖 19 所示。
圖 19. 更改屬性類型
-
保存并關(guān)閉業(yè)務(wù)對象編輯器
現(xiàn)在,您已經(jīng)創(chuàng)建了兩個業(yè)務(wù)對象。
定義服務(wù)接口
現(xiàn)在,您可以創(chuàng)建 SCA 接口了。此外,信用審批服務(wù)是一個請求-響應(yīng)服務(wù),它接收信用應(yīng)用程序并同時返回信用等級。服務(wù)接口定義服務(wù)客戶機(jī)和服務(wù)提供者之間的交互。
有多種創(chuàng)建接口的方式。如果您選擇 Java 接口,可以使用 WebSphere Integration Developer 中的 Java Eclipse 工具來進(jìn)行創(chuàng)建。在我們的示例中,我們將在業(yè)務(wù)集成透視圖中創(chuàng)建 WSDL 接口。您可以使用 Assembly Editor 創(chuàng)建,也可以使用業(yè)務(wù)集成視圖創(chuàng)建。我們將使用后者。(稍后,我們將使用 Assembly Editor 創(chuàng)建實現(xiàn)。)
-
首先,我們將使用 Business Integration 視圖菜單創(chuàng)建接口。
-
右鍵單擊 Interfaces 菜單項,然后選擇 New => Interfaces,如圖 20 所示。
圖 20. 創(chuàng)建新接口
-
在 New Interface 菜單中,輸入名稱 CreditApproval
。(請記住出于演示的目的,在我們的示例中,我們使用的是缺省包和文件夾。您可以選擇一個文件夾,輕松地按功能對不同的接口進(jìn)行分組。)
圖 21. 創(chuàng)建新接口
-
CreditApproval 接口是一個簡單的 WSDL 文件。WebSphere Integration Developer 附帶了一個簡單的 WSDL 編輯器,可以用來構(gòu)建接口。
-
在創(chuàng)建接口時,接口編輯器應(yīng)該已經(jīng)打開。如果接口編輯器尚未打開,可以在業(yè)務(wù)集成視圖中雙擊接口,以將接口編輯器打開。
-
首先,我們要創(chuàng)建一個簡單的請求-響應(yīng)操作。(您還可以創(chuàng)建用于異步調(diào)用的單向操作,但是現(xiàn)在,我們只創(chuàng)建簡單的同步請求。)單擊 Add Request Response Operation 圖標(biāo),如圖 22 所示。
圖 22. Add Request Response Operation 圖標(biāo)
-
將在編輯器中創(chuàng)建一個操作。將該操作命名為 calculateCreditRating
。(圖 23)
圖 23. 定義操作
-
現(xiàn)在我們需要定義參數(shù)。請記住,我們創(chuàng)建了兩個業(yè)務(wù)對象,一個用于輸入,另一個用于輸出。在創(chuàng)建操作后,選擇 Add Input 圖標(biāo),如圖 24 所示。
圖 24. Add Input 圖標(biāo)
-
將輸入命名為 CreditApplication
。
-
選擇 Type 列并找到 CreditApplicaiton 業(yè)務(wù)對象。您可以看到,業(yè)務(wù)對象現(xiàn)在是一個有效類型,可以用于構(gòu)建接口,如圖 25 所示。(在這里你可以選擇創(chuàng)建新業(yè)務(wù)對象。)
圖 25. 新業(yè)務(wù)對象現(xiàn)在是一個有效類型
-
接下來,選擇 Add Output 圖標(biāo),如圖 26 所示。
圖 26. Add Output 圖標(biāo)
-
選擇 CreditRating 作為類型,類似于選擇輸入的類型。
圖 27. 定義輸出
-
保存并關(guān)閉接口編輯器。
-
如果您希望檢查 WSDL 文件,可以在 Physical Resources 視圖中右鍵單擊 CreditApproval.wsdl 文件,然后使用文本編輯器打開該文件。(圖 28)
圖 28. 查看 WSDL 文件
WSDL 文件應(yīng)該類似于下面的代碼示例。
清單 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)建了標(biāo)準(zhǔn)的接口和業(yè)務(wù)對象。現(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 組件,然后將其與接口相關(guān)聯(lián)。)
圖 30. 將接口拖至 Assembly Editor
-
將出現(xiàn)一個文本框。選擇 Component with No Implementation Type,如圖 31 所示。
圖 31. 組件創(chuàng)建文本框
-
現(xiàn)在,您應(yīng)該在 Assembly Editor 上看到一個名為 Component1 的 SCA 組件。(圖 32)
圖 32. SCA 組件圖標(biāo)
-
通過選擇組件并鍵入名稱,您可以更改名稱;或者可以使用屬性編輯器更改名稱,如圖 33 所示。將顯示名稱更改為 CreditApproval
。名稱字段應(yīng)該自動更改。
圖 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)應(yīng)該在 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 服務(wù)管理器查找業(yè)務(wù)對象工廠 (Business Object Factory),后者用于從 XML 模式中創(chuàng)建業(yè)務(wù)對象。出于演示的目的,我們創(chuàng)建響應(yīng)數(shù)據(jù)對象,并返回硬編碼的數(shù)據(jù)。
-
如果您粘貼代碼,則可能出現(xiàn)一些編譯錯誤。通過右鍵單擊編輯器并選擇 Source => Organize Imports,您可以更正這些錯誤,如圖 35 所示。
圖 35. 更正錯誤
-
保存并關(guān)閉 Java 文件,但是 Assembly Editor 保持打開狀態(tài)。
對 SCA 組件進(jìn)行單元測試
WebSphere Integration Developer 提供了使用單元測試工具對組件進(jìn)行單元測試的功能。根據(jù) SCA 實現(xiàn)的類型,您可以在 J2SE 環(huán)境中測試 SCA 組件,通過該環(huán)境,可以在沒有完整的應(yīng)用程序服務(wù)器的情況下測試組件;當(dāng)然,這在很大程度上取決于您具有的組件的類型。可以在 J2SE 環(huán)境中輕松地對 Java 實現(xiàn)進(jì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ù)
-
將顯示可用的運(yùn)行時列表。選擇 Eclipse 1.4 JVM,然后單擊 Finish。(圖 38)
圖 38. 運(yùn)行時部署位置
-
要開始測試,請選擇 Return 項,如圖 39 所示。監(jiān)視 Events 窗口以查看流程。
圖 39. Events 窗口
-
您將在右側(cè)看到結(jié)果。(圖 40)
圖 40. 單元測試結(jié)果
創(chuàng)建 SCA 客戶機(jī) Web 應(yīng)用程序并在 WebSphere Process Server 中進(jìn)行測試
-
要讓打包在同一 SCA 部署中的非 SCA 組件調(diào)用 SCA 組件,我們需要創(chuàng)建獨(dú)立引用:
-
在 SCA Assembly Editor 中,請選擇面板中 Import 圖標(biāo)旁邊的 arrow。這將打開一個更小的子菜單。選擇 Standalone references 圖標(biāo),并將其拖至 Assembly Editor 中的任何位置,如圖 41 所示。
圖 41. 創(chuàng)建獨(dú)立引用
-
單擊 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 客戶機(jī)使用 SCA API 交互。選擇 Yes。(圖 44)
圖 44. 接口轉(zhuǎn)換驗證
-
有了獨(dú)立引用后,現(xiàn)在我們可以在同一模塊的非 SCA 組件中調(diào)用 SCA 組件。請記住,SCA 模塊是由 EAR 文件實現(xiàn)的,因此您可以將其他 J2EE 組件添加到 SCA 模塊。在我們的示例中,我們要導(dǎo)入具有 JSP 文件的現(xiàn)有 WAR 文件。WAR 文件將是基礎(chǔ) 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. 導(dǎo)入 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. 設(shè)置依賴項
-
要讓 Web 項目知道 SCA Java 接口,可以右鍵單擊 Web 項目并選擇 Properties。
-
轉(zhuǎn)到 Java JAR Dependencies 并選擇 CreditApprovalSCAModuleEJBClient.jar,它是在下面生成的 EJB 客戶機(jī) JAR 文件。(圖 53)
圖 53. 設(shè)置依賴項
-
關(guān)閉編輯器。此時,您可以選擇執(zhí)行整體構(gòu)建。這可能沒有必要,但我們總是喜歡在部署前進(jìn)行整體構(gòu)建。如果您有自動構(gòu)建,可以進(jìn)行清理,如圖 54 所示。
圖 54. 用于自動構(gòu)建的清理
-
現(xiàn)在,我們可以在 WebSphere Process Server 上部署并測試我們的 SCA 組件和 Web 客戶機(jī)了。請記住,我們的 SCA 模塊是由 J2EE 應(yīng)用程序?qū)崿F(xiàn)的。您可以轉(zhuǎn)到 J2EE 透視圖來查看構(gòu)件。請記住,它們是生成的構(gòu)件。(我們以后將在這一系列文章中進(jìn)行介紹。)
圖 55. J2EE 透視圖
-
轉(zhuǎn)到 Business Integration 透視圖底部的 Servers 視圖。右鍵單擊 WebSphere Process Server,然后選擇 Start,如圖 56 所示。
圖 56. 啟動 WebSphere Process Server
-
等待服務(wù)器啟動。檢查控制臺并等待圖 57 中所示的消息。
圖 57. WebSphere Process Server 啟動消息
-
再次右鍵單擊服務(wù)器并選擇 Add and remove projects。(圖 58)
圖 58. 添加和刪除項目
-
選擇 CreditApprovalSCAModuleAdd,然后選擇 Add,如圖 59 所示。這會將其移到右側(cè)的 Configured projects 框中。
圖 59. 在服務(wù)器上配置項目
-
監(jiān)視右下角的進(jìn)度,等待部署應(yīng)用程序。(圖 60)
圖 60. 項目部署監(jiān)視器
-
在控制臺驗證 CreditApporvalSCAModuleApp 已經(jīng)啟動。(圖 61)
圖 61. 管理控制臺消息
-
轉(zhuǎn)到 Web 透視圖。右鍵單擊 JSP,然后選擇 Run => Run on Server,如圖 62 所示。
圖 62. 運(yùn)行應(yīng)用程序
-
選擇現(xiàn)有的 WebSphere Process Server,接著選擇 Set server as project default,然后單擊 Finish。(圖 63)
圖 63. 設(shè)置服務(wù)器
-
當(dāng)應(yīng)用程序執(zhí)行時,輸入圖 64 中所示的應(yīng)用程序測試數(shù)據(jù)。
圖 64. 輸入 SCA 應(yīng)用程序測試數(shù)據(jù)
-
您應(yīng)該獲得圖 65 所示的結(jié)果。
圖 65. SCA 應(yīng)用程序測試結(jié)果
-
關(guān)閉瀏覽器并停止服務(wù)器。
祝賀您!您已經(jīng)創(chuàng)建并測試了第一個 SCA 組件!
結(jié)束語
服務(wù)組件體系結(jié)構(gòu) (SCA) 是面向服務(wù)的體系結(jié)構(gòu) (SOA) 中的一個主要變化。SCA 向我們提供了 SOA 的編程模型,并將在今后作為集成的基礎(chǔ)。請繼續(xù)關(guān)注本系列的后續(xù)文章,我們將研究特定 SCA 功能的細(xì)節(jié)以及它們可給您的應(yīng)用程序帶來的好處。