| 2003 年 1 月 01 日 在 這個(gè)系列的第一篇文章里, Joshy Joseph 討論了 JAX-RPC 標準的一個(gè)重要方面:它的類(lèi)型映射系統。既然知道了 JAX-RPC 怎樣把 XML 類(lèi)型映射成 Java 類(lèi)型,您就可以認真地研究這個(gè)規范,包括它的異常處理機制和潛在的運行時(shí)服務(wù)了。讀完本文后,您就可以開(kāi)始構建基于 JAVA 的互操作 Web 服務(wù)了。 基于 XML 的遠程過(guò)程調用的 JAVA API(Java APIs for XML-based Remote Procedure Call(JAX-RPC))在 Java Community Process 已經(jīng)作為 JSR 101 進(jìn)入了最后建議階段。XML Web 服務(wù)提供商已經(jīng)開(kāi)始將這個(gè)包作為核心 API 在 JAVA 平臺上構建互操作 Web 服務(wù)。在本系列中,我會(huì )引導讓您一步一步地了解這個(gè)標準提供的主要功能,并使用樣本代碼作為全程指導。 在 本系列的第一部分中,我描述了 WSDL/XML 類(lèi)型和 JAVA 類(lèi)型之間的互相映射。我解釋了 JAX-RPC 標準怎樣定義該功能,以及關(guān)于如何設計互操作類(lèi)型系統的一些要點(diǎn)。在某種程度上,這個(gè)類(lèi)型映射標準有助于使 Web 服務(wù)運行時(shí)系統實(shí)現消息級別的互操作性。 在這本系列的第二部分中,您將學(xué)到如何用 JAX-RPC 標準的客戶(hù)機和服務(wù)器端接口定義和消息處理模型實(shí)現下一級別的 Web 服務(wù)互操作性。 您可以回憶一下,JAX-RPC 規范包括下列主題:
正 如我在本系列的第 1 部分談到的那樣,我討論了 JAX-RPC 的類(lèi)型映射系統的重要方面?,F在我將探究一下規范中剩余部分的重點(diǎn)。正如我在第一部分所做的那樣,我將用一段代碼(來(lái)自為 ACME 售書(shū)商所做的樣本 Web 服務(wù))來(lái)描述這些要點(diǎn)。要想了解關(guān)于本示例的更多信息,請參閱第 1 部分,要了解關(guān)于本示例完整的 WSDL 清單,請參閱 附錄。(請參閱 參考資料以了解更多信息) JAX-RPC 服務(wù)端點(diǎn)指的是真正的服務(wù)實(shí)現所依賴(lài)的 Web 服務(wù)端點(diǎn)。請參閱 圖 1,那里有一個(gè)服務(wù)端點(diǎn)實(shí)現(具體的)類(lèi)和一個(gè)服務(wù)端點(diǎn)接口的定義。 圖 1. 服務(wù)實(shí)現接口層次結構 ![]() Web 服務(wù)端點(diǎn)類(lèi)是通過(guò)使用 WSDL2JAVA(一個(gè)由 Apache Axis 提供的 WSDL 到 Java 的映射工具)由服務(wù)端點(diǎn)界面派生出來(lái)的,而服務(wù)端點(diǎn)界面是根據 WSDL 定義創(chuàng )建的。正如 JAX-RPC 規范的 5.2 節中預先定義好的一樣,這些服務(wù)端點(diǎn)必須和服務(wù)端點(diǎn)接口定義一致。這個(gè)定義的一些要求如下:
清單 1包含一個(gè)服務(wù)端點(diǎn)接口的示例。 清單 1. 服務(wù)端點(diǎn)接口
注意 清單 1 中的樣本端點(diǎn)接口處理運行時(shí) 也要注意,基于 SOAP 的分布式系統和基于其他協(xié)議(如 RMI)的分布式系統的主要的實(shí)現上的區別是,前者不支持通過(guò)引用傳遞和返回對象。因此您應該避免去創(chuàng )建一個(gè)使用遠程引用作為參數或返回值的服務(wù)端點(diǎn)。另外 JAVA 值的類(lèi)型和數組不應該存有遠程引用。 一些服務(wù)提供商(如 WASP)有支持遠程對象引用的實(shí)現??墒菫檫@些實(shí)現寫(xiě)的代碼可能在運行時(shí)系統之間缺少可移植性。例如,可能不是所有的 JAX-RPC 系統都支持 清單 2 中的代碼,因為 清單 2. 潛在的無(wú)可移植性的代碼
服務(wù)端點(diǎn)實(shí)現類(lèi)型是由服務(wù)端點(diǎn)接口派生出來(lái)的。作為對這個(gè)接口的補充,這個(gè)服務(wù)端點(diǎn)實(shí)現類(lèi)可能實(shí)現 清單 3. 服務(wù)生命周期聲明
這個(gè)接口使得 JAX-RPC 運行時(shí)系統能管理 Web 服務(wù)示例的生命周期。(如果這個(gè)服務(wù)實(shí)現是一個(gè) servlet,那么這個(gè)運行時(shí)系統就是一個(gè) servlet 容器。)這個(gè)運行時(shí)系統負責裝載服務(wù)端點(diǎn)類(lèi)以及服務(wù)端點(diǎn)類(lèi)的實(shí)例化。實(shí)例化之后,它將調用 您開(kāi)發(fā)一個(gè)服務(wù)端點(diǎn)類(lèi)時(shí),您必須確保這個(gè)端點(diǎn)不維護任何屬于客戶(hù)機的狀態(tài)。這個(gè)運行時(shí)系統可以把多個(gè)對該服務(wù)端點(diǎn)接口的客戶(hù)機調用分派到對于這個(gè)單一實(shí)例。并且注意這些服務(wù)端點(diǎn)示例可能被運行時(shí)程序合用以提高性能。 在運行時(shí)系統把端點(diǎn)從客戶(hù)服務(wù)里除去時(shí),這個(gè)運行時(shí)系統必須調用
您可以看到 JAX-RPC 規范試圖在應用程序級和運行系統級處理 Web 服務(wù)運行時(shí)的異常,這是基于服務(wù)端點(diǎn)接口的標準設計方法以及它對 這個(gè)特定于服務(wù)的異常是在 清單 4. wsdl.operation 聲明
在 清單 5中,您可以看到 JAX-RPC 規范怎樣創(chuàng )建它的服務(wù)端點(diǎn)來(lái)處理特定于服務(wù)的 JAVA 異常。 清單 5. 處理特定于服務(wù)的 JAVA 異常
清單 6包括作為結果創(chuàng )建的 JAVA 異常類(lèi) 清單 6. Java 異常類(lèi)
JAX-PPC 允許運行時(shí)系統靈活地管理上下文信息(注意, 作 為一個(gè)例子,我們來(lái)探究一個(gè)基于 servlet 的運行時(shí)系統,然后看一下它是怎樣管理上下文信息的。這個(gè) servlet 端點(diǎn)上下文包括的信息有用戶(hù)主體、消息上下文、基于 http 的用戶(hù)會(huì )話(huà)信息以及 servlet 上下文。這個(gè)規范要求服務(wù)運行時(shí)在所有對服務(wù)端點(diǎn)實(shí)例的遠程方法調用之間維護全部這些信息。您可以從下面的清單 7 中的服務(wù)上下文接口看到,這是一個(gè)有價(jià)值的信息,一個(gè)服務(wù)可以通過(guò)多種途徑利用它:
簡(jiǎn)單的說(shuō),這個(gè)接口提供了關(guān)于調用程序、消息、當前環(huán)境的細節的動(dòng)態(tài)運行時(shí)信息。 清單 7告訴您怎樣擴展您的服務(wù)實(shí)現類(lèi)來(lái)支持生命周期管理以及怎樣使用服務(wù)上下文。 清單 7. 服務(wù)上下文接口
現在我們來(lái)考慮一下 JAX-RPC 規范的最強大的功能, 消息處理程序。 消息處理程序向 Web 服務(wù)端點(diǎn)(客戶(hù)機和服務(wù)器)提供了附加的消息處理功能,作為對基本服務(wù)實(shí)現邏輯的擴展。處理程序可以處理加密和解密、日志記錄和審計等。當前的 JAX-RPC 運行時(shí)系統僅僅定義了 SOAP 消息處理程序,但是它可以很靈活的定義其他處理程序,而且不需要任何消息處理模型。 圖 2. 服務(wù)和處理程序調用模型 ![]() JAX-RPC 處理程序 API 定義了三個(gè)基本的方法,還有兩個(gè)生命周期方法,表示在清單 8 中。 清單 8. 處理程序方法
一個(gè)處理程序應該被作為無(wú)狀態(tài)的實(shí)例實(shí)現。通過(guò)提供初始化的接口(
您可以隨意地從 API 提供的缺省處理程序派生出新的處理程序,也可以從 SOAP 消息處理程序( 處理程序鏈表示一個(gè)有序的處理程序清單。這個(gè)分組有助于您定義和該處理程序調用模型相關(guān)聯(lián)的策略。這些策略的示例包括調用順序、調用風(fēng)格(例如一個(gè)單向的調用只調用 您可以通過(guò)指定動(dòng)作者( 角色;請參閱 SOAP 1.1 規范以了解更多細節;您可以在下面的 參考資料部分找到一個(gè)相關(guān)的鏈接)的 URI 來(lái)將處理程序鏈和 SOAP 動(dòng)作者相關(guān)聯(lián)。缺省情況下,處理程序鏈總是一直與特定的 SOAP 動(dòng)作者 清單 9顯示了一個(gè)能訪(fǎng)問(wèn) SOAP 消息頭的樣本實(shí)現。 清單 9. 樣本處理程序
客戶(hù)機 JAX-RPC 的亮點(diǎn)之一就在于它能把上下文信息和端點(diǎn)的遠程方法調用關(guān)聯(lián)起來(lái)。注意,JAX-RPC 規范并不強求上下文信息的語(yǔ)義。用戶(hù)可以根據 WSDL 綁定中 SOAP 頭定義的顯式定義它;也可以根據 WS-Security 之類(lèi)的標準定義它;或者通過(guò)使用特定于綁定的細節(比如 HTTP 請求頭)來(lái)定義它。 這個(gè)運行時(shí)上下文信息可以由容器或者客戶(hù)機來(lái)設定。容器管理的上下文管理被稱(chēng)作 隱式上下文管理,而客戶(hù)機管理的管理被稱(chēng)作 顯式上下文管理。 在這里使用 隱式一詞是因為在隱式上下文管理中,客戶(hù)機或服務(wù)器上都不需要進(jìn)行編程以支持上下文傳播,這種支持是由運行時(shí)引擎提供的。這種上下文信息的示例包括安全和事務(wù)信息。 顯式服務(wù)上下文的表現形式是作為追加于服務(wù)方法調用的附加參數。當從 JAVA 參數映射到 WSDL 時(shí)這可能會(huì )引發(fā)問(wèn)題,因為這些增加的元素將映射到 WSDL 頭。 清單 10 通過(guò)端點(diǎn) JAVA 接口表示了一個(gè) WSDL 定義及它的 清單 10. WSDL 定義的端點(diǎn) JAVA 接口
在 清單 10中,您能看到上下文被加到了方法參數上。 JAX-RPC 規范不強制處理服務(wù)上下文的服務(wù)器端模型。定義處理程序來(lái)進(jìn)行服務(wù)上下文是由容器提供商(針對隱式或顯式上下文管理)和程序員(針對顯式上下文管理)決定的。您能看到,這使得上下文路由和設置報頭消息處理器變得靈活。
JAX-RPC 規范 API 在遠程過(guò)程調用和/或返回值時(shí)支持 MIME 編碼的內容的使用。這是以帶附件的 SOAP 標準為基礎的(請參閱 參考資料)。 帶附件的 SOAP 消息是通過(guò)使用 MIME multipart/related 類(lèi)型建立的。根部件是初始的 SOAP 消息,MIME 內容被作為消息的另外部件添加。這些 SOAP 部件可能包含對 MIME 部件的引用。也要注意每一個(gè) MIME 部件包含內容的 ID 或內容定位信息來(lái)唯一地標識 MIME 部件。請參閱 圖 3,它顯示了一條樣本 MIME 消息。 圖3. SOAP 消息包 ![]() JAVA 服務(wù)端點(diǎn)接口中的遠程方法可能使用幾個(gè) JAVA 類(lèi)型中的一個(gè)來(lái)表示 MIME 編碼的內容。
JAX-RPC 運行時(shí)系統通過(guò)以下幾點(diǎn)決定 MIME 部件的 MIME 類(lèi)型。
這里有幾個(gè)必須由 JAX-RPC 運行時(shí)基礎架構支持的確定的要求。我將在這里討論最重要的兩個(gè)。 JAX-RPC 運行時(shí)系統必須支持最基本的 HTTP 認證??蛻?hù)機發(fā)送用戶(hù)名和密碼到 HTTP 服務(wù)器,它們在那里被驗證(HTTP 服務(wù)器被認為是 JAX-RPC 運行時(shí)系統的一部分)。所有其他的安全機制(數字證書(shū)、SSL、WS-Security 等)都是由客戶(hù)機和服務(wù)器運行時(shí)系統所提供的增值功能。這些可以用 JAX-RPC 處理程序和服務(wù)傳播來(lái)處理。想了解更多細節,您可以參閱系統文檔來(lái)了解關(guān)于您的特定運行時(shí)更多細節。 這個(gè)要求使客戶(hù)機能參與和服務(wù)端點(diǎn)的會(huì )話(huà)。JAX-RPC 的運行時(shí)系統至少應該支持下面中的一個(gè):
服務(wù)器初始化會(huì )話(huà)管理進(jìn)程。您可以通過(guò)設置 JAX-RPC 會(huì )話(huà)管理中的一個(gè)最明顯的遺漏是對 SOAP 基于頭的會(huì )話(huà)相關(guān)性的要求,目前大多數工具包都支持此會(huì )話(huà)相關(guān)性。一旦您已經(jīng)定義了會(huì )話(huà)管理的標準方式,并且各方已經(jīng)在 WS-I 和其他標準上達成一致,那么您就可以認為規范的下一個(gè)版本將會(huì )要求這一點(diǎn)。
![]() 這里是三個(gè)不同的從客戶(hù)機調用服務(wù)端點(diǎn)的的模型,如 圖 4所示。它們獨立于任何特定于服務(wù)實(shí)現的模型。我將依次討論每一個(gè)模型的細節。
如果您正在為 J2EE 開(kāi)發(fā),您應該記住下面的特定于 J2EE 的 JAX-RPC 要求:
到現在為止,我已經(jīng)討論了 JAX-RPC 的大部分功能,您可以用這些功能來(lái)生成互操作性的 Web 服務(wù)。關(guān)于這個(gè)標準的這個(gè)介紹性系列文章將使您能夠開(kāi)發(fā)出具有最大程度互操作性的 Web 服務(wù)。正如我早些時(shí)候提到過(guò)的,有很多不同的 JAX-RPC 運行時(shí)引擎的實(shí)現可供使用,還有不同質(zhì)量級別的服務(wù)功能(來(lái)支持 J2EE)可供使用;因此,您總是應該咨詢(xún)您的應用程序容器提供商來(lái)了解更多關(guān)于對 JAX-RPC 支持程度的信息?,F在,沒(méi)有哪個(gè)單獨的 JAX-RPC 運行時(shí)系統可以提供本系列中討論的所有功能。我確信將有這個(gè)規范的修正版來(lái)支持最近的 SOAP 和 WSDL 規范(兩個(gè)規范現在的版本都達到了 1.2);JAX-RPC 也可以采用 JAXB(Java XML Binding,JAVA XML 綁定,JSR31)作為互操作性類(lèi)型映射。請密切注視這個(gè)規范,因為 Web 服務(wù)發(fā)展能支持越來(lái)越多的服務(wù)概要和 SOAP 頭擴展。
| |||||||||||||||||||||||||||||||||||||||||||||||||||
聯(lián)系客服