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