2003 年 1 月 01 日
在
這個(gè)系列的第一篇文章里, Joshy Joseph 討論了 JAX-RPC 標(biāo)準(zhǔn)的一個(gè)重要方面:它的類型映射系統(tǒng)。既然知道了 JAX-RPC
怎樣把 XML 類型映射成 Java
類型,您就可以認(rèn)真地研究這個(gè)規(guī)范,包括它的異常處理機(jī)制和潛在的運(yùn)行時(shí)服務(wù)了。讀完本文后,您就可以開始構(gòu)建基于 JAVA 的互操作 Web
服務(wù)了。
基于
XML 的遠(yuǎn)程過(guò)程調(diào)用的 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)開始將這個(gè)包作為核心 API 在 JAVA 平臺(tái)上構(gòu)建互操作 Web
服務(wù)。在本系列中,我會(huì)引導(dǎo)讓您一步一步地了解這個(gè)標(biāo)準(zhǔn)提供的主要功能,并使用樣本代碼作為全程指導(dǎo)。
在
本系列的第一部分中,我描述了 WSDL/XML 類型和 JAVA 類型之間的互相映射。我解釋了 JAX-RPC 標(biāo)準(zhǔn)怎樣定義該功能,以及關(guān)于如何設(shè)計(jì)互操作類型系統(tǒng)的一些要點(diǎn)。在某種程度上,這個(gè)類型映射標(biāo)準(zhǔn)有助于使 Web 服務(wù)運(yùn)行時(shí)系統(tǒng)實(shí)現(xiàn)消息級(jí)別的互操作性。
在這本系列的第二部分中,您將學(xué)到如何用 JAX-RPC 標(biāo)準(zhǔn)的客戶機(jī)和服務(wù)器端接口定義和消息處理模型實(shí)現(xiàn)下一級(jí)別的 Web 服務(wù)互操作性。
您可以回憶一下,JAX-RPC 規(guī)范包括下列主題:
- 類型映射系統(tǒng)
- 服務(wù)端點(diǎn)
- 異常處理
- 服務(wù)端點(diǎn)上下文
- 消息處理程序
- 服務(wù)客戶機(jī)和服務(wù)上下文
- 帶附件的 SOAP
- 運(yùn)行時(shí)服務(wù)
- JAX-RPC 客戶機(jī)調(diào)用模型
正
如我在本系列的第 1 部分談到的那樣,我討論了 JAX-RPC
的類型映射系統(tǒng)的重要方面?,F(xiàn)在我將探究一下規(guī)范中剩余部分的重點(diǎn)。正如我在第一部分所做的那樣,我將用一段代碼(來(lái)自為 ACME 售書商所做的樣本
Web 服務(wù))來(lái)描述這些要點(diǎn)。要想了解關(guān)于本示例的更多信息,請(qǐng)參閱第 1 部分,要了解關(guān)于本示例完整的 WSDL 清單,請(qǐng)參閱 附錄。(請(qǐng)參閱
參考資料以了解更多信息)
服務(wù)端點(diǎn)
JAX-RPC
服務(wù)端點(diǎn)指的是真正的服務(wù)實(shí)現(xiàn)所依賴的 Web 服務(wù)端點(diǎn)。請(qǐng)參閱
圖 1,那里有一個(gè)服務(wù)端點(diǎn)實(shí)現(xiàn)(具體的)類和一個(gè)服務(wù)端點(diǎn)接口的定義。
圖 1. 服務(wù)實(shí)現(xiàn)接口層次結(jié)構(gòu)
服務(wù)端點(diǎn)接口
Web 服務(wù)端點(diǎn)類是通過(guò)使用 WSDL2JAVA(一個(gè)由 Apache Axis 提供的 WSDL 到 Java
的映射工具)由服務(wù)端點(diǎn)界面派生出來(lái)的,而服務(wù)端點(diǎn)界面是根據(jù) WSDL 定義創(chuàng)建的。正如 JAX-RPC 規(guī)范的 5.2
節(jié)中預(yù)先定義好的一樣,這些服務(wù)端點(diǎn)必須和服務(wù)端點(diǎn)接口定義一致。這個(gè)定義的一些要求如下:
- 所有服務(wù)端點(diǎn)必須繼承
java.rmi.Remote 接口。
- 所有由這個(gè)接口實(shí)現(xiàn)的方法必須拋出一個(gè)
java.rmi.RemoteException 。可能有特定于應(yīng)用程序的異常作為這個(gè)標(biāo)準(zhǔn)異常的補(bǔ)充。
- 這個(gè)方法參數(shù)必須是 JAX-RPC 支持的 Java 類型。用這種方法,這個(gè)規(guī)范為 Java 平臺(tái)和它對(duì)應(yīng)的 XML 類型保證了一個(gè)適當(dāng)?shù)男蛄谢?反序列化機(jī)制。
- 通常,Java接口可以通過(guò)使用
public static final 聲明維護(hù)常量數(shù)據(jù)。然而,JAX-RPC 規(guī)范阻礙您這么做,這個(gè)規(guī)范表明 WSDL 1.1 在
wsdl.porttype 中對(duì)常量的表示不標(biāo)準(zhǔn)。
- 您可以使用
Holder 和
SOAPElement 類作為接口方法的自變量。(請(qǐng)參閱這個(gè)系列的第 1 部分,您可得到關(guān)于
Holder 和
SOAPElement 類的更多信息。)
清單 1包含一個(gè)服務(wù)端點(diǎn)接口的示例。
清單 1. 服務(wù)端點(diǎn)接口
Public interface AuthorSearchService implements java.rmi.Remote{ Public Books[] seachForAuthor(String authorName) throws java.rmi.RemoteException, com.acme.InvalidAuthorName; }
|
注意
清單 1 中的樣本端點(diǎn)接口處理運(yùn)行時(shí)
RemoteException 和應(yīng)用程序級(jí)的
InvalidAuthorName 。在我描述 JAX-RPC 異常處理時(shí),我將更深入地看一下語(yǔ)義上的意思以及應(yīng)用程序異常之間的關(guān)系(在 WSDL 的上下文環(huán)境里)。
也要注意,基于 SOAP 的分布式系統(tǒng)和基于其他協(xié)議(如 RMI)的分布式系統(tǒng)的主要的實(shí)現(xiàn)上的區(qū)別是,前者不支持通過(guò)引用傳遞和返回對(duì)象。因此您應(yīng)該避免去創(chuàng)建一個(gè)使用遠(yuǎn)程引用作為參數(shù)或返回值的服務(wù)端點(diǎn)。另外 JAVA 值的類型和數(shù)組不應(yīng)該存有遠(yuǎn)程引用。
一些服務(wù)提供商(如 WASP)有支持遠(yuǎn)程對(duì)象引用的實(shí)現(xiàn)。可是為這些實(shí)現(xiàn)寫的代碼可能在運(yùn)行時(shí)系統(tǒng)之間缺少可移植性。例如,可能不是所有的 JAX-RPC 系統(tǒng)都支持
清單 2 中的代碼,因?yàn)? BookSearchBroker 對(duì)象是通過(guò)引用返回的。
清單 2. 潛在的無(wú)可移植性的代碼
Public interface BookSearchBroker extends java.rmi.Remote{ Public Books[] searchForAuthor(String tickerSymbol) throws java.rmi.RemoteException; } public interface StockQuote extends java.rmi.Remote{ public BookSearchBroker getBooksSearchBroker() throws java.rmi.RemoteException; }
|
服務(wù)端點(diǎn)實(shí)現(xiàn)類型
服務(wù)端點(diǎn)實(shí)現(xiàn)類型是由服務(wù)端點(diǎn)接口派生出來(lái)的。作為對(duì)這個(gè)接口的補(bǔ)充,這個(gè)服務(wù)端點(diǎn)實(shí)現(xiàn)類可能實(shí)現(xiàn)
ServiceLifecycle 接口來(lái)管理服務(wù)的生命周期(請(qǐng)參閱
圖 1)。這個(gè)接口的聲明在
清單 3中給出。
清單 3. 服務(wù)生命周期聲明
Public interface ServiceLifecycle{ void init (Object context) throws ServiceException; void destroy(); }
|
這個(gè)接口使得 JAX-RPC 運(yùn)行時(shí)系統(tǒng)能管理 Web 服務(wù)示例的生命周期。(如果這個(gè)服務(wù)實(shí)現(xiàn)是一個(gè) servlet,那么這個(gè)運(yùn)行時(shí)系統(tǒng)就是一個(gè) servlet 容器。)這個(gè)運(yùn)行時(shí)系統(tǒng)負(fù)責(zé)裝載服務(wù)端點(diǎn)類以及服務(wù)端點(diǎn)類的實(shí)例化。實(shí)例化之后,它將調(diào)用
ServiceLifecycle.init() 方法來(lái)初始化服務(wù)示例。
ServiceLifecycle.init() 認(rèn)為運(yùn)行時(shí)上下文
ServiceContext 是一個(gè)參數(shù)。我將在后面的題名為
服務(wù)上下文的部分里更加的在細(xì)節(jié)上討論運(yùn)行時(shí)上下文這個(gè)問題。
您開發(fā)一個(gè)服務(wù)端點(diǎn)類時(shí),您必須確保這個(gè)端點(diǎn)不維護(hù)任何屬于客戶機(jī)的狀態(tài)。這個(gè)運(yùn)行時(shí)系統(tǒng)可以把多個(gè)對(duì)該服務(wù)端點(diǎn)接口的客戶機(jī)調(diào)用分派到對(duì)于這個(gè)單一實(shí)例。并且注意這些服務(wù)端點(diǎn)示例可能被運(yùn)行時(shí)程序合用以提高性能。
在運(yùn)行時(shí)系統(tǒng)把端點(diǎn)從客戶服務(wù)里除去時(shí),這個(gè)運(yùn)行時(shí)系統(tǒng)必須調(diào)用
ServiceLifecycle.destroy() 方法。這有助于服務(wù)類實(shí)例放棄它正在使用的資源。
異常處理
您可以看到 JAX-RPC 規(guī)范試圖在應(yīng)用程序級(jí)和運(yùn)行系統(tǒng)級(jí)處理 Web 服務(wù)運(yùn)行時(shí)的異常,這是基于服務(wù)端點(diǎn)接口的標(biāo)準(zhǔn)設(shè)計(jì)方法以及它對(duì)
wsdl.fault 元素的映射。
這個(gè)特定于服務(wù)的異常是在
wsdl.fault 元素中聲明的,這些異常類型是由
java.lang.Exception 類派生的。
清單 4 中的
wsdl.operation 聲明包括特定的
wsdl.fault 元素。
清單 4. wsdl.operation 聲明
<message name="AuthorNotFoundException"> <part name="Author" type="xsd:string" /> </message> <portType name ="BookSearch"> <operation name="getBooksByAuthor" > <input message="tns:getAuthorName"> <output message="tns:getBookList"> <fault name=" AuthorNotFoundException" message=" tns: AuthorNotFoundException"> </operation> </portType>
|
在
清單 5中,您可以看到 JAX-RPC 規(guī)范怎樣創(chuàng)建它的服務(wù)端點(diǎn)來(lái)處理特定于服務(wù)的 JAVA 異常。
清單 5. 處理特定于服務(wù)的 JAVA 異常
Public interface BookSearch implements java.rmi.Remote{ Public Books[] getBooksByAuthor(String authorName) throws java.rmi.RemoteException, com.acme.AuthorNotFoundException; }
|
清單 6包括作為結(jié)果創(chuàng)建的 JAVA 異常類
清單 6. Java 異常類
public class AuthorNotFoundException extends java.lang.Exception{ ........... public AuthorNotFoundException(String Author ){ ..... } public getAuthor(){...} }
|
服務(wù)端點(diǎn)上下文
JAX-PPC 允許運(yùn)行時(shí)系統(tǒng)靈活地管理上下文信息(注意,
ServiceLifecycle.init() 方法希望得到
Object 類型的上下文)。每一個(gè)運(yùn)行時(shí)環(huán)境可以維護(hù)它自己獨(dú)特的上下文信息。例如,基于 servlet 的運(yùn)行時(shí)系統(tǒng)維護(hù)一個(gè)
ServletEndpointContext 對(duì)象。EJB 2.1 規(guī)范定義了 EJB
SessionContext 。
作
為一個(gè)例子,我們來(lái)探究一個(gè)基于 servlet 的運(yùn)行時(shí)系統(tǒng),然后看一下它是怎樣管理上下文信息的。這個(gè) servlet
端點(diǎn)上下文包括的信息有用戶主體、消息上下文、基于 http 的用戶會(huì)話信息以及 servlet
上下文。這個(gè)規(guī)范要求服務(wù)運(yùn)行時(shí)在所有對(duì)服務(wù)端點(diǎn)實(shí)例的遠(yuǎn)程方法調(diào)用之間維護(hù)全部這些信息。您可以從下面的清單 7
中的服務(wù)上下文接口看到,這是一個(gè)有價(jià)值的信息,一個(gè)服務(wù)可以通過(guò)多種途徑利用它:
- HTTP 會(huì)話信息幫助客戶機(jī)維護(hù)和服務(wù)器的 HTTP 會(huì)話。這是可以任選的功能部件。
- 用戶主體(如果運(yùn)行時(shí)系統(tǒng)已經(jīng)驗(yàn)證了這個(gè)用戶)幫助服務(wù)開發(fā)者驗(yàn)證用戶來(lái)得到特定的運(yùn)行時(shí)操作。
- 另外一個(gè)很好的由這個(gè)接口提供的功能是它對(duì) SOAP 信息上下文傳播的支持。這幫助服務(wù)實(shí)現(xiàn)者從請(qǐng)求處理程序鏈中獲得 SOAP 信息上下文,然后處理該上下文并將其與響應(yīng)處理程序鏈關(guān)聯(lián)。
簡(jiǎn)單的說(shuō),這個(gè)接口提供了關(guān)于調(diào)用程序、消息、當(dāng)前環(huán)境的細(xì)節(jié)的動(dòng)態(tài)運(yùn)行時(shí)信息。
清單 7告訴您怎樣擴(kuò)展您的服務(wù)實(shí)現(xiàn)類來(lái)支持生命周期管理以及怎樣使用服務(wù)上下文。
清單 7. 服務(wù)上下文接口
Public interface BookSearchServiceImpl implements java.rmi.Remote, javax.xml.rpc.server. ServiceLifecycle { public void init(Object context) throws ServiceException{ ServletEndpointConext sC = (ServletEndpointConext)context; Java.security.Principal userPrinciple = sC. getUserPrincipal(); HttpSession session = null; Try{ session = sC.getHttpSession(); }catch(JAXRPCException e){ // Not an HTTP based //endpoint } MessageContext ctx = sC.getMessageContext(); } public void destroy(){ } public Books[] searchForBooks(String authorName) throws java.rmi.RemoteException, com.acme.InvalidAuthor{ return null; } }
|
消息處理程序
現(xiàn)在我們來(lái)考慮一下 JAX-RPC 規(guī)范的最強(qiáng)大的功能,
消息處理程序。
消息處理程序向 Web
服務(wù)端點(diǎn)(客戶機(jī)和服務(wù)器)提供了附加的消息處理功能,作為對(duì)基本服務(wù)實(shí)現(xiàn)邏輯的擴(kuò)展。處理程序可以處理加密和解密、日志記錄和審計(jì)等。當(dāng)前的
JAX-RPC 運(yùn)行時(shí)系統(tǒng)僅僅定義了 SOAP 消息處理程序,但是它可以很靈活的定義其他處理程序,而且不需要任何消息處理模型。
圖 2. 服務(wù)和處理程序調(diào)用模型
JAX-RPC 處理程序 API 定義了三個(gè)基本的方法,還有兩個(gè)生命周期方法,表示在清單 8 中。
清單 8. 處理程序方法
public class Handler{ handleRequest(MessageContext context) handleResponse(MessageContext context) handleFaults(MessageContext context) init(HandlerInfo info); destroy(); ........... }
|
一個(gè)處理程序應(yīng)該被作為無(wú)狀態(tài)的實(shí)例實(shí)現(xiàn)。通過(guò)提供初始化的接口(
Handler.init (HandlerInfo info) ),運(yùn)行時(shí)系統(tǒng)可以把所要求的上下文信息傳遞給處理程序。這將幫助處理程序獲得特定于容器的增值功能的訪問權(quán),包括認(rèn)證機(jī)制,事務(wù)處理,日志記錄的框架等。
 |
處理程序?qū)崿F(xiàn)和 JSR 109
在
為 J2EE 容器開發(fā) JAX-RPC 處理程序之前,您必須向 J2EE 容器供應(yīng)商咨詢。根據(jù)實(shí)現(xiàn)企業(yè) Web 服務(wù)(Implementing
Enterprise Web
Services)規(guī)范(JSR109),處理程序在應(yīng)用程序執(zhí)行上下文中運(yùn)行,因此只能支持有限的功能。為了更好地理解這個(gè)因容器產(chǎn)生的限制,請(qǐng)考慮一
下有關(guān)安全性的情況:您可能不會(huì)寫 JAX-RPC 的處理程序來(lái)支持 WS-Security
在應(yīng)用程序?qū)舆M(jìn)行認(rèn)證和授權(quán)。這個(gè)決定應(yīng)該在應(yīng)用程序執(zhí)行之前作出。請(qǐng)參閱您的 J2EE 容器供應(yīng)商文檔中關(guān)于 Web
服務(wù)的內(nèi)容,以獲得更多信息。要了解更多關(guān)于 JSR109 的信息,請(qǐng)參閱下面的 參考資料。
|
|
您可以隨意地從 API 提供的缺省處理程序派生出新的處理程序,也可以從 SOAP 消息處理程序(
SOAPMessageContext
作為一個(gè)參數(shù))或者普通處理程序來(lái)派生出新的處理程序。處理程序可以修改傳遞到自身的消息。因?yàn)槌鲇诎踩缘脑?,這些處理程序是很靈活的,所以大多數(shù)現(xiàn)
在可用的框架將在運(yùn)行時(shí)系統(tǒng)的控制下管理它們。例如,在一個(gè) J2EE 的容器里,處理程序可能是 J2EE
容器的一部分。因此,您應(yīng)該去查找您的應(yīng)用程序服務(wù)器(運(yùn)行時(shí))供應(yīng)商文檔來(lái)找到更多關(guān)于和您正在使用的產(chǎn)品一起被提供的內(nèi)置處理程序信息。這些內(nèi)置處理
程序可能是為 WS-Security、WS-Transaction 或日志記錄等原因設(shè)計(jì)的。盡管您能編寫自己的 JAX-RPC
處理程序,應(yīng)用程序服務(wù)器提供商也能夠根據(jù)配置和安全策略決定是否允許一個(gè)新的處理程序存在。
處理程序鏈
處理程序鏈表示一個(gè)有序的處理程序清單。這個(gè)分組有助于您定義和該處理程序調(diào)用模型相關(guān)聯(lián)的策略。這些策略的示例包括調(diào)用順序、調(diào)用風(fēng)格(例如一個(gè)單向的調(diào)用只調(diào)用
handleRequest() ;它不會(huì)調(diào)用
handleResponse() )等。另外一個(gè)您可以在處理程序鏈上設(shè)置的的策略:處理程序鏈可以根據(jù) SOAP 頭最外層的元素的
qname 調(diào)用處理程序。您可以通過(guò)
Handler.init() 方法傳遞一個(gè)
HandlerInfo 對(duì)象來(lái)將這個(gè)關(guān)聯(lián)配置到處理程序。只有當(dāng)前正在處理的處理程序返回
true 時(shí),處理程序鏈才繼續(xù)處理這個(gè)處理程序。
您可以通過(guò)指定動(dòng)作者(
角色;請(qǐng)參閱 SOAP 1.1 規(guī)范以了解更多細(xì)節(jié);您可以在下面的
參考資料部分找到一個(gè)相關(guān)的鏈接)的 URI 來(lái)將處理程序鏈和 SOAP 動(dòng)作者相關(guān)聯(lián)。缺省情況下,處理程序鏈總是一直與特定的 SOAP 動(dòng)作者
next 相關(guān)聯(lián)。正如 WSDL 端口限定名所表明的,處理程序鏈?zhǔn)窃诿糠?wù)端點(diǎn)的基礎(chǔ)上注冊(cè)的。
清單 9顯示了一個(gè)能訪問 SOAP 消息頭的樣本實(shí)現(xiàn)。
清單 9. 樣本處理程序
Public class AcmeSOAPHeaderHandler extends GenericHandler{ Public Boolean handleRequest(MessageContext ctx){ try{ SOAPMessageContext mc = (SOAPMessageContext)ctx; SOAPMessage msg = mc.getMessage(); SOAPPart sp = msg.getSOAPPart(); SOAPEnvelop se = sp.getEnvelop(); SOAPHeader header= se.getHeader(); // Now we can process the header if (everything fine ) return true; // chain handlers //continue processing else{ //Return false results in chaining to stop return false; } }catch(Exception ex){ } } }
|
服務(wù)客戶機(jī)和服務(wù)上下文
客戶機(jī) JAX-RPC 的亮點(diǎn)之一就在于它能把上下文信息和端點(diǎn)的遠(yuǎn)程方法調(diào)用關(guān)聯(lián)起來(lái)。注意,JAX-RPC
規(guī)范并不強(qiáng)求上下文信息的語(yǔ)義。用戶可以根據(jù) WSDL 綁定中 SOAP 頭定義的顯式定義它;也可以根據(jù) WS-Security
之類的標(biāo)準(zhǔn)定義它;或者通過(guò)使用特定于綁定的細(xì)節(jié)(比如 HTTP 請(qǐng)求頭)來(lái)定義它。
這個(gè)運(yùn)行時(shí)上下文信息可以由容器或者客戶機(jī)來(lái)設(shè)定。容器管理的上下文管理被稱作
隱式上下文管理,而客戶機(jī)管理的管理被稱作
顯式上下文管理。
在這里使用
隱式一詞是因?yàn)樵陔[式上下文管理中,客戶機(jī)或服務(wù)器上都不需要進(jìn)行編程以支持上下文傳播,這種支持是由運(yùn)行時(shí)引擎提供的。這種上下文信息的示例包括安全和事務(wù)信息。
顯式服務(wù)上下文的表現(xiàn)形式是作為追加于服務(wù)方法調(diào)用的附加參數(shù)。當(dāng)從 JAVA 參數(shù)映射到 WSDL 時(shí)這可能會(huì)引發(fā)問題,因?yàn)檫@些增加的元素將映射到 WSDL 頭。
清單 10 通過(guò)端點(diǎn) JAVA 接口表示了一個(gè) WSDL 定義及它的
soap:header 信息和顯式的服務(wù)上下文表示。
清單 10. WSDL 定義的端點(diǎn) JAVA 接口
public interface BookSerachService implements java.rmi.Remote{ public Books[] searchForBooks(String authorName, StringHolder context) throws RemoteException; }
|
在
清單 10中,您能看到上下文被加到了方法參數(shù)上。
JAX-RPC 規(guī)范不強(qiáng)制處理服務(wù)上下文的服務(wù)器端模型。定義處理程序來(lái)進(jìn)行服務(wù)上下文是由容器提供商(針對(duì)隱式或顯式上下文管理)和程序員(針對(duì)顯式上下文管理)決定的。您能看到,這使得上下文路由和設(shè)置報(bào)頭消息處理器變得靈活。
帶附件的 SOAP
JAX-RPC 規(guī)范 API 在遠(yuǎn)程過(guò)程調(diào)用和/或返回值時(shí)支持 MIME 編碼的內(nèi)容的使用。這是以帶附件的 SOAP 標(biāo)準(zhǔn)為基礎(chǔ)的(請(qǐng)參閱
參考資料)。
帶附件的 SOAP 消息是通過(guò)使用 MIME multipart/related 類型建立的。根部件是初始的 SOAP 消息,MIME
內(nèi)容被作為消息的另外部件添加。這些 SOAP 部件可能包含對(duì) MIME 部件的引用。也要注意每一個(gè) MIME 部件包含內(nèi)容的 ID
或內(nèi)容定位信息來(lái)唯一地標(biāo)識(shí) MIME 部件。請(qǐng)參閱 圖 3,它顯示了一條樣本 MIME 消息。
圖3. SOAP 消息包
JAVA 服務(wù)端點(diǎn)接口中的遠(yuǎn)程方法可能使用幾個(gè) JAVA 類型中的一個(gè)來(lái)表示 MIME 編碼的內(nèi)容。
JAX-RPC 運(yùn)行時(shí)系統(tǒng)通過(guò)以下幾點(diǎn)決定 MIME 部件的 MIME 類型。
- 使用 WSDL 中
mime.content 元素定義的 MIME 類型
- SOAP 消息中 MIME 部件的
Content-Type
運(yùn)行時(shí)服務(wù)
這里有幾個(gè)必須由 JAX-RPC 運(yùn)行時(shí)基礎(chǔ)架構(gòu)支持的確定的要求。我將在這里討論最重要的兩個(gè)。
安全性
JAX-RPC 運(yùn)行時(shí)系統(tǒng)必須支持最基本的 HTTP 認(rèn)證??蛻魴C(jī)發(fā)送用戶名和密碼到 HTTP 服務(wù)器,它們?cè)谀抢锉或?yàn)證(HTTP
服務(wù)器被認(rèn)為是 JAX-RPC 運(yùn)行時(shí)系統(tǒng)的一部分)。所有其他的安全機(jī)制(數(shù)字證書、SSL、WS-Security
等)都是由客戶機(jī)和服務(wù)器運(yùn)行時(shí)系統(tǒng)所提供的增值功能。這些可以用 JAX-RPC
處理程序和服務(wù)傳播來(lái)處理。想了解更多細(xì)節(jié),您可以參閱系統(tǒng)文檔來(lái)了解關(guān)于您的特定運(yùn)行時(shí)更多細(xì)節(jié)。
會(huì)話管理
這個(gè)要求使客戶機(jī)能參與和服務(wù)端點(diǎn)的會(huì)話。JAX-RPC 的運(yùn)行時(shí)系統(tǒng)至少應(yīng)該支持下面中的一個(gè):
- 基于 Cookie 的會(huì)話管理
- URL 重寫
- SSL 會(huì)話
服務(wù)器初始化會(huì)話管理進(jìn)程。您可以通過(guò)設(shè)置
session.maintain 屬性為
true 來(lái)表明服務(wù)器就緒以支持會(huì)話。要了解更多具體如何做的細(xì)節(jié),請(qǐng)參閱樣本。
JAX-RPC 會(huì)話管理中的一個(gè)最明顯的遺漏是對(duì) SOAP 基于頭的會(huì)話相關(guān)性的要求,目前大多數(shù)工具包都支持此會(huì)話相關(guān)性。一旦您已經(jīng)定義了會(huì)話管理的標(biāo)準(zhǔn)方式,并且各方已經(jīng)在 WS-I 和其他標(biāo)準(zhǔn)上達(dá)成一致,那么您就可以認(rèn)為規(guī)范的下一個(gè)版本將會(huì)要求這一點(diǎn)。
JAX-RPC 客戶機(jī)調(diào)用模型
圖 4. 客戶機(jī)端 JAX-RPC
這里是三個(gè)不同的從客戶機(jī)調(diào)用服務(wù)端點(diǎn)的的模型,如
圖 4所示。它們獨(dú)立于任何特定于服務(wù)實(shí)現(xiàn)的模型。我將依次討論每一個(gè)模型的細(xì)節(jié)。
如果您正在為 J2EE 開發(fā),您應(yīng)該記住下面的特定于 J2EE 的 JAX-RPC 要求:
- 服務(wù)應(yīng)該實(shí)現(xiàn)
javax.naming.referenceable 和/或
java.io.serlializable 接口來(lái)支持注冊(cè)和查找。
- 組件供應(yīng)商必須在部署描述符中聲明所有的服務(wù)引用。
結(jié)束語(yǔ)
到現(xiàn)在為止,我已經(jīng)討論了 JAX-RPC 的大部分功能,您可以用這些功能來(lái)生成互操作性的 Web
服務(wù)。關(guān)于這個(gè)標(biāo)準(zhǔn)的這個(gè)介紹性系列文章將使您能夠開發(fā)出具有最大程度互操作性的 Web 服務(wù)。正如我早些時(shí)候提到過(guò)的,有很多不同的
JAX-RPC 運(yùn)行時(shí)引擎的實(shí)現(xiàn)可供使用,還有不同質(zhì)量級(jí)別的服務(wù)功能(來(lái)支持
J2EE)可供使用;因此,您總是應(yīng)該咨詢您的應(yīng)用程序容器提供商來(lái)了解更多關(guān)于對(duì) JAX-RPC 支持程度的信息。現(xiàn)在,沒有哪個(gè)單獨(dú)的
JAX-RPC 運(yùn)行時(shí)系統(tǒng)可以提供本系列中討論的所有功能。我確信將有這個(gè)規(guī)范的修正版來(lái)支持最近的 SOAP 和 WSDL
規(guī)范(兩個(gè)規(guī)范現(xiàn)在的版本都達(dá)到了 1.2);JAX-RPC 也可以采用 JAXB(Java XML Binding,JAVA XML
綁定,JSR31)作為互操作性類型映射。請(qǐng)密切注視這個(gè)規(guī)范,因?yàn)?Web 服務(wù)發(fā)展能支持越來(lái)越多的服務(wù)概要和 SOAP 頭擴(kuò)展。
參考資料
關(guān)于作者
 |

|
 |
Joshy Joseph 是一個(gè)在 IBM OGSA 開發(fā)小組中工作的軟件工程師。他編程時(shí)主要喜歡使用 Web 服務(wù)、語(yǔ)義 Web、REST 及網(wǎng)格計(jì)算這樣的新興技術(shù),以及基于UML、AOP 和 XP 的編程模型。您可以通過(guò)
joshy@us.ibm.com和他聯(lián)系。
|
|