Java SCA 調(diào)用樣式[zhuan]
本文概略介紹了服務(wù)組件體系結(jié)構(gòu)(Service Component Architecture,SCA)的傳統(tǒng) Java 對象(plain old Java object,POJO)組件中的 Java 用法以及傳入傳出 POJO 組件的數(shù)據(jù)流。您將通過本文了解在 POJO 組件中使用不同調(diào)用樣式的效果。
盡管已在相關(guān)的課程中說明了 IBM WebSphere Integration Developer 用戶采用 Java 編程所需的每個步驟,但仍然會出現(xiàn)有必要使用 Java 和 POJO 組件的情況。
需 要 POJO 組件的一個重要例子是將僅理解 WSDL 描述的組件的組件與僅能通過 Java 接口進行公開的組件集成時。此外,不能在 WebSphere Integration Developer 的各個向?qū)?nèi)操作的數(shù)據(jù)(如 anyType 類型的數(shù)據(jù))可以通過使用服務(wù)數(shù)據(jù)對象(Service Data Object,SDO)API 在 POJO 組件范圍內(nèi)手動進行處理。這些場景就是相當有意義的用例,說明了對 POJO 的需求。
本文提供了考慮調(diào)用樣式以及需要傳入傳出數(shù)據(jù)的 POJO 組件的 Java 編碼基本知識。但本文并不打算描述所有與 SCA POJO 使用有關(guān)的場景。
本文假定您熟悉 SCA 的基本知識,包括模塊和引用的概念。
為 了說明此處介紹的概念,我們將首先描述一個簡單的 Hello World 示例。我們的示例是單個 SCA 模塊,名為 HWModule,其中包括兩個 POJO 組件,分別名為 HelloWorld 和 MessageLogger。MessageLogger 將直接向控制臺打印來自 HelloWorld 的消息,并返回有關(guān)操作是否成功的信息。圖 1 顯示了描述 MessageLogger 的接口的 WSDL:
圖 1. MessageLogger WSDL 接口

圖 2 顯示了描述 HelloWorld 的接口的 WSDL:
圖 2. HelloWorld WSDL 接口

圖 3 顯示了示例的組裝關(guān)系圖:
圖 3. HWModule 組裝關(guān)系圖

![]() |
|
HelloWorld 使用兩個引用與 MessageLogger 進行交互。一個由 Java 進行類型設(shè)置 (j-typed),另一個由 WSDL 進行類型設(shè)置 (w-typed),如圖 4 中所示。
圖 4. HelloWorld 引用

圖 5 顯示了 HelloWorld 和 MessageLogger 之間的 HWMessage 業(yè)務(wù)對象(Business Object,BO):
圖 5. HWMessage BO

此示例的更多細節(jié)將在以下各個相應(yīng)的部分中進行討論。
![]() ![]() |
![]()
|
本 文重點討論兩種調(diào)用樣式:動態(tài)調(diào)用接口(Dynamic Invocation Interface,DII)和強類型。DII 是一種通用的動態(tài)調(diào)用模型,所得到的“調(diào)用”類型是這樣的:傳入操作名稱,并傳入操作的輸入?yún)?shù)。強類型調(diào)用并不會以“調(diào)用”告終,而會最終得到一個強類 型調(diào)用。
![]() |
|
強類型調(diào)用只能在 j-typed 引用上完成。在我們的示例中,我們在已經(jīng)過 j-typed 的 HelloWorld 上定義了一個名為 MessageLoggerPartner 的引用,如圖 6 中所示。
圖 6. HelloWorld 引用

清單 1 顯示了 HelloWorld 的 sayHello() 方法中的代碼,該方法將以強類型方式調(diào)用經(jīng)過 j-typed 的 MessageLoggerPartner 引用:
清單 1. HelloWorld 的 sayHello() 示例代碼,使用 j-type 引用進行強類型調(diào)用
|
在 上面的代碼中,您將發(fā)現(xiàn)方法 locateService_MessageLoggerPartner() 用于向 MessageLogger 返回一個代理。將為 POJO 組件定義的每個引用生成此方法。在我們的例子中有兩個引用,MessageLoggerPartner 和 MessageLoggerPartner1,因此在 HelloWorld 中生成了兩個方法 locateService_MessageLoggerPartner() 和 locateService_MessageLoggerPartner1()。
![]() |
|
無論為引用定義的類型如何,都可以進行弱類型調(diào)用;不過,如果引用是 w-typed,客戶端將需要使用 DII。
J-typed 引用與 DII
我們也可以采用弱類型方式使用 MessageLoggerPartner 引用。清單 2 顯示了 HelloWorld 的 sayHello() 方法中的代碼,其中采用弱類型方式調(diào)用 j-typed 的 MessageLoggerPartner 引用:
清單 2. HelloWorld 的 sayHello() 示例代碼,使用 j-type 引用進行 DII 調(diào)用
|
所有內(nèi)容都與強類型調(diào)用類似,不同的是要向“調(diào)用”傳入操作名稱和輸入?yún)?shù)。
W-typed 引用與 DII
如果引用是 w-typed 的,則用戶唯一 可用的調(diào)用樣式就是 DII。在我們的示例中,除了 j-typed 引用外 (MessageLoggerPartner),還定義了另一個引用,即已經(jīng)過 w-typed 的 MessageLoggerPartner1,如圖 7 中所示。
圖 7. HelloWorld 引用

清單 3 顯示了 HelloWorld 的 sayHello() 方法中的代碼,以便采用 DII 方式使用此 w-typed 的 HWMessageLoggerPartner1 引用:
清單 3. HelloWorld 的 sayHello() 示例代碼,使用 w-type 引用進行 DII 調(diào)用
|
正如可從清單 3 中了解到的,這個場景更為有意義。其中頗有意義的一部分是傳入/傳出調(diào)用的輸入類型。
![]() |
|
在最后一個場景中,我們將使用與 doc-literal wrapped (DLW) WSDL 中的“wrapper”元素對應(yīng)的數(shù)據(jù)對象(inputWrapper 和 outputWrapper)。
因此,為了理解發(fā)送何種類型(強類型或弱類型),將需要兩條信息。首先,將需要知道 WSDL 的樣式(DLW 或任何其他樣式),其次,將需要知道引用類型(j-type 或 w-type)。
表 1. 輸入/輸出類型決策表
j-typed 引用 | w-type 引用 (DLW) | w-type 引用(任何其他樣式) | |
---|---|---|---|
弱類型 (DII) | 對于簡單類型,使用 Java 原語;對于復(fù)雜類型,使用數(shù)據(jù)對象 | WSDL 中為消息指定的 Wrapper 元素,用于封裝有效負載對象:HWMessage 或 Boolean 以及其他諸如此類的內(nèi)容。消息元素將始終是一個數(shù)據(jù)對象。 | 為有效負載指定的類型——不過此處并沒有包裝。如果有效負載是復(fù)雜類型,則為數(shù)據(jù)對象;如果是簡單類型,則為 Java 原語。 |
強類型 | 對于簡單類型,使用 Java 原語;對于復(fù)雜類型,使用數(shù)據(jù)對象 | WSDL 中為消息指定的 Wrapper 元素,用于封裝有效負載對象 HWMessage 或 Boolean 以及其他諸如此類的內(nèi)容。消息元素將始終是一個數(shù)據(jù)對象。 | 為有效負載指定的類型——不過此處并沒有包裝。如果有效負載是復(fù)雜類型,則為數(shù)據(jù)對象;如果是簡單類型,則為 Java 原語。 |
由于可以采用多種方式調(diào)用任何給定的引用,因此可能會遇到一些已知問題。下面將給出其中的常見問題。
ClassCastException 問題
這個常見的錯誤消息指示所接收或發(fā)送的數(shù)據(jù)不是所預(yù)期的數(shù)據(jù)。例如,如果用戶不知道在某些情況下需要包裝,則可能會在對返回對象進行強制轉(zhuǎn)換時發(fā)出此消息。補救方法是更改代碼,以強制轉(zhuǎn)換為正確的對象。
IllegalArgumentException: Class 'x' does not have a feature named 'y' 問題
這個錯誤消息也指示所接收或發(fā)送的數(shù)據(jù)不是預(yù)期的數(shù)據(jù),但發(fā)生在稍后對數(shù)據(jù)進行訪問時。例如,接收某個數(shù)據(jù)對象的用戶可能認為其不是包裝數(shù)據(jù)對象,并嘗試直接訪問數(shù)據(jù)。直接訪問此數(shù)據(jù)將會導致出現(xiàn)錯誤。補救辦法是對代碼進行更改,以訪問正確的屬性。
![]() ![]() |
![]()
|
這篇短文概略介紹了在 POJO 組件中選擇強調(diào)用樣式還是弱調(diào)用樣式,并說明了可能出現(xiàn)的兩個常見錯誤,即 ClassCastException 和 IllegalArgumentException。
![]() ![]() |
![]()
|
描述 | 名字 | 大小 | 下載方法 |
---|---|---|---|
Hello World sample project interchange | ws-soa-sca-java-inv-pi.zip | 13KB | HTTP |
![]() |
||||
![]() |
關(guān)于下載方法的信息 | ![]() |
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。
- 閱讀服務(wù)組件體系結(jié)構(gòu) (SCA) 的一系列規(guī)范 服務(wù)組件體系結(jié)構(gòu)(Service Component Architecture, SCA) 規(guī)范
- “我應(yīng)該采用哪一種 WSDL 樣式?”描述了每種組合的 WSDL 和 SOAP 消息,可幫助您確定使用哪個樣式組合。
![]() |
||
![]() |
Anh-Khoa Phan 在 IBM 的 Rochester Development Lab 擔任軟件工程師。他目前在從事 WebSphere Business Integration 方面的工作。 |
![]() |
||
![]() |
Eric Herness 在 IBM 的 Rochester Development Lab 擔任 Websphere Business Integration 的首席架構(gòu)師。他是 WebSphere Foundation Architecture Board 的高級成員,同時也是 Software Group Architecture Board 的核心成員。Eric 研究對象技術(shù)和分布式計算中的產(chǎn)品體系結(jié)構(gòu)和產(chǎn)品開發(fā)已超過 15 年。 |
posted on 2008-03-12 18:51 gembin 閱讀(590) 評論(0) 編輯 收藏 所屬分類: SCA 、SOA