現在我們來集中關注圖2中wrapper Web service 的實現。它實現了方法getQuote,該方法包含一個簡單的EJB 調用。首先,它從JNDI得到EJB的有效引用并創建一個EJB實例。然后它將在EJB上調用方法 getQuote,然后刪除該EJB。最后,調用結果返回到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) 現在我們可以通過運行deploy_service 腳本程序來配置EJB wrapper Web services。然后,運行run_wrapper 腳本程序來啟動Web service 客戶端。客戶端將會通過wrapper Web service來調用EJB。 注:為了說明wrapper方法的基本原來,我們盡可能使這個演示樣本簡單。然而,實際中的應用通常會復雜一些。wrapper 服務常用于集成多個EJBs的功能和其他的J2EE資源。在這些情況下,wrapper服務通常會顯現不同的編程接口而不是原始的beans。 透明的J2EE 集成integration 訪問J2EE資源的另一方法就是使用透明的集成框架。這里,透明是指我們沒有必要來編寫一個wrapper服務或者改變最初的J2EE代碼。假如您希望SOAP客戶端利用現有的J2EE資源或者通過因特網訪問J2EE資源,這種方法就非常有用了。 下面所描述的透明的J2EE 集成框架將充分利用JNDI框架的優勢,這種優勢提供了一種訪問J2EE資源的抽象機制。正如我們先前所說的,在J2EE的正常流程中,J2EE客戶端將調用JNDI的lookup方法,而客戶端的JNDI提供者把這個請求通過RMI傳遞給J2EE服務器中的JNDI服務。JNDI給客戶端返回一個 J2EE代理。客戶端使用這個代理,通過RMI遠程調用J2EE資源。在這個示例中,我們所使用的客戶端JNDI的提供者支持SOAP而不支持RMI。正如您在圖3中所看到的,當客戶端使用這個提供者發布一個JNDI請求時,該請求將通過SOAP發送到JNDI web service。 這個JNDI web service將在應用程序服務器JNDI中進行實際的查找并獲得J2EE代理。然后JNDI web service將一個基于SOAP的客戶端遠程引用返回給J2EE代理。客戶端應用程序此時就能夠使用這個遠程引用來調用J2EE資源。每一種方法調用都將通過SOAP傳遞給J2EE代理。J2EE代理會把請求重新定向到實際的J2EE資源。您可能會注重到J2EE資源或者客戶端代碼都不需要進行修改。只需在客戶端實施一個配置更改而已,即指向基于SOAP的JNDI提供者。 圖 3: Web service有權使用JNDI 注:大多數Web service運行時間服務器和應用程序服務器是在相同的上下文環境中運轉。因此,調用重定向方法將會非常迅速,并且不會降低性能。 這種方法也適用于非Java的客戶端。因為JNDI Web service是一種標準的Web service,任何的SOAP客戶端都能夠充分利用它的透明調用框架。例如, Microsoft Visual Basic 客戶端可以調用JNDI Web service上的方法查詢并且獲得所請求的J2EE資源的Web service代理。 對于在Web service運行時間創建的所有組件,JNDI Web service將執行自動遠程碎片賬集。當客戶端應用程序顯式丟棄遠程組件時,根據相關請求,這些組件中的大多數也會被丟棄。但是在松散連接條件下的Web services并不能保證做到適當刪除。這就是LifeCycle服務需要跟蹤并治理所有動態創建資源的原因。這種方法的主要優勢就