现在我们来集中关注图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服务需要跟踪并治理所有动态创建资源的原因。这种方法的主要优势就