現(xiàn)在我們來集中關(guān)注圖2中wrapper Web service 的實現(xiàn)。它實現(xiàn)了方法getQuote,該方法包含一個簡單的EJB 調(diào)用。首先,它從JNDI得到EJB的有效引用并創(chuàng)建一個EJB實例。然后它將在EJB上調(diào)用方法 getQuote,然后刪除該EJB。最后,調(diào)用結(jié)果返回到Web service 客戶端。在下面的代碼中您可以看到這些步驟:
package com.systinet.demos.stock; import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingException; import java.rmi.RemoteException; public class StockQuoteService { public double getQuote(String symbol) throws Exception { // get the JNDI initial context System.err.println("Getting J2EE initial context"); Context jndiContext = new InitialContext(); // lookup the EJB home System.err.println("Looking up EJB Home"); Object homeRef = jndiContext.lookup("Stock"); StockQuoteHome home = (StockQuoteHome)javax.rmi.PortableRemoteObject.narrow( homeRef, StockQuoteHome.class); // create the EJB instance System.err.println("Creating EJB"); StockQuote ejb = home.create(); // call the getQuote method System.err.println("Calling getQuote"); double quote = ejb.getQuote("SUNW"); System.err.println("SUNW "+quote); // remove the EJB System.err.println("Removing EJB"); ejb.remove(); return quote; }
} 圖 2:簡單的 Web service EJB wrapper (StockQuoteService.java) 現(xiàn)在我們可以通過運行deploy_service 腳本程序來配置EJB wrapper Web services。然后,運行run_wrapper 腳本程序來啟動Web service 客戶端。客戶端將會通過wrapper Web service來調(diào)用EJB。 注:為了說明wrapper方法的基本原來,我們盡可能使這個演示樣本簡單。然而,實際中的應(yīng)用通常會復(fù)雜一些。wrapper 服務(wù)常用于集成多個EJBs的功能和其他的J2EE資源。在這些情況下,wrapper服務(wù)通常會顯現(xiàn)不同的編程接口而不是原始的beans。 透明的J2EE 集成integration 訪問J2EE資源的另一方法就是使用透明的集成框架。這里,透明是指我們沒有必要來編寫一個wrapper服務(wù)或者改變最初的J2EE代碼。假如您希望SOAP客戶端利用現(xiàn)有的J2EE資源或者通過因特網(wǎng)訪問J2EE資源,這種方法就非常有用了。 下面所描述的透明的J2EE 集成框架將充分利用JNDI框架的優(yōu)勢,這種優(yōu)勢提供了一種訪問J2EE資源的抽象機制。正如我們先前所說的,在J2EE的正常流程中,J2EE客戶端將調(diào)用JNDI的lookup方法,而客戶端的JNDI提供者把這個請求通過RMI傳遞給J2EE服務(wù)器中的JNDI服務(wù)。JNDI給客戶端返回一個 J2EE代理。客戶端使用這個代理,通過RMI遠程調(diào)用J2EE資源。在這個示例中,我們所使用的客戶端JNDI的提供者支持SOAP而不支持RMI。正如您在圖3中所看到的,當客戶端使用這個提供者發(fā)布一個JNDI請求時,該請求將通過SOAP發(fā)送到JNDI web service。 這個JNDI web service將在應(yīng)用程序服務(wù)器JNDI中進行實際的查找并獲得J2EE代理。然后JNDI web service將一個基于SOAP的客戶端遠程引用返回給J2EE代理。客戶端應(yīng)用程序此時就能夠使用這個遠程引用來調(diào)用J2EE資源。每一種方法調(diào)用都將通過SOAP傳遞給J2EE代理。J2EE代理會把請求重新定向到實際的J2EE資源。您可能會注重到J2EE資源或者客戶端代碼都不需要進行修改。只需在客戶端實施一個配置更改而已,即指向基于SOAP的JNDI提供者。 圖 3: Web service有權(quán)使用JNDI 注:大多數(shù)Web service運行時間服務(wù)器和應(yīng)用程序服務(wù)器是在相同的上下文環(huán)境中運轉(zhuǎn)。因此,調(diào)用重定向方法將會非常迅速,并且不會降低性能。 這種方法也適用于非Java的客戶端。因為JNDI Web service是一種標準的Web service,任何的SOAP客戶端都能夠充分利用它的透明調(diào)用框架。例如, Microsoft Visual Basic 客戶端可以調(diào)用JNDI Web service上的方法查詢并且獲得所請求的J2EE資源的Web service代理。 對于在Web service運行時間創(chuàng)建的所有組件,JNDI Web service將執(zhí)行自動遠程碎片賬集。當客戶端應(yīng)用程序顯式丟棄遠程組件時,根據(jù)相關(guān)請求,這些組件中的大多數(shù)也會被丟棄。但是在松散連接條件下的Web services并不能保證做到適當刪除。這就是LifeCycle服務(wù)需要跟蹤并治理所有動態(tài)創(chuàng)建資源的原因。這種方法的主要優(yōu)勢就