Spring in Action 学习笔记—第六章 远程调用
远程调用是客户端应用和服务端之间的会话。在客户端上所需要的一些功能并不包括在该应用的职能范围内。所以应用向能提供这些功能的其他系统寻求帮助。远程的应用通过远程服务把这些功能公开出来。
?
一、Spring远程调用概览
Spring为各种远程访问技术的集成提供了工具类。Spring远程支持是由普通(Spring)POJO实现的,这使得开发具有远程访问功能的服务变得相当容易。
Spring远程调用支持6种不同的RPC模式:远程方法调用(RMI)、Caucho的Hessian和Burlap、Spring自己的HTTP invoker、EJB和使用JAX-RPC 的Web Services。
RPC模式
?在何种情况下有用
?
远程方法调用(RMI)
?不考虑网络限制(如防火墙)时,访问/公开基于Java的服务
?
Hessian或 Burlap
?考虑网络限制时,通过HTTP访问/公开基于Java的服务
?
HTTP invoker
?考虑网络限制时,访问/公开基于Spring的服务
?
EJB
?访问用EJB实现的遗留的J2EE系统
?
JAX-RPC
?访问Web Services
?
其中(来自Spring2.0参考手册):
l???????? 远程方法调用(RMI)。通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,Spring同时支持传统的RMI(使用java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的透明远程调用(支持任何Java接口)。
l???????? Spring的HTTP调用器。Spring提供了一种特殊的允许通过HTTP进行Java串行化的远程调用策略,支持任意Java接口(就像RMI调用器)。相对应的支持类是 HttpInvokerProxyFactoryBean 和 HttpInvokerServiceExporter。
l???????? Hessian。通过 HessianProxyFactoryBean 和 HessianServiceExporter,可以使用Caucho提供的基于HTTP的轻量级二进制协议来透明地暴露服务。
l???????? Burlap。 Burlap是Caucho的另外一个子项目,可以作为Hessian基于XML的替代方案。Spring提供了诸如 BurlapProxyFactoryBean 和 BurlapServiceExporter 的支持类。
l???????? JAX RPC。Spring通过JAX-RPC为远程Web服务提供支持。
不管选择哪种远程模式,你会发现Spring对每一种模式的支持中贯穿着一个共同的风格。这就意味着你一旦理解了Spring如何配置并使用其中的一种模式,当你决定使用另一种不同的模式的时候,你将拥有非常低的学习曲线。
在所有的模式中,服务可以作为Spring管理的Bean配置到你的应用中。这是用一个代理工厂Bean实现的,这个Bean使你能把远程服务当作本地对象一样置入到其他Bean的属性中。
客户端发起对代理的调用,好像是代理提供了这些服务的功能一样。代理代表客户端和远程服务交流。它处理连接的具体情况,并向远程服务发起远程调用。
在服务端,你能够把任何Spring管理的Bean的功能公开成为一个远程服务,可使用在表6.1中所列的任何模式(除了EJB和JAX-RPC)。
不论开发的是使用远程服务的代码,还是实现那些服务的代码,或者二者兼而有之,在Spring中,使用远程服务纯粹是个配置问题。你不用写任何Java代码来支持远程调用。你的服务Bean不必关心它们是否被卷入到RPC里(虽然任何传递给远程调用的Bean或从远程调用返回的Bean可能需要实现java.io.Serializable)。
?
二、与RMI一起工作
1.连接RMI服务
Spring的RmiProxyFactoryBean是一个工厂Bean,能创建一个指向RMI服务的代理。用RmiProxyFactoryBean来引用一个RMI PaymentService是非常简单的,只要在Spring配置文件中声明下面的<bean>:
<bean id="paymentService" class= "org.springframework.remoting.
?
????????? ?httpinvoker.HttpInvokerProxyFactoryBean">
?
??? <property name="serviceUrl">
?
????? <value>http://${serverName}/${contextPath}/pay.service</value>
?
??? </property>
?
??? <property name="serviceInterface">
?
????? <value>com.springinaction.payment.PaymentService</value>
?
??? </property>
?
? </bean>
serviceInterface属性仍然用来表示这个支付服务所实现的接口;serviceUrl属性仍然是用来表示远程支付服务的位置。由于HTTP invoker是基于HTTP的,如同Hessian和Burlap一样,serviceUrl就能包含与Hessian和Burlap版本的Bean里一样的URL。
2.把Bean作为HTTP服务公开
使用HttpInvokerServiceExporter把Bean的方法输出为远程方法,面的Bean的定义展示了如何把paymentService Bean作为一个远程的基于HTTP invoker的服务输出:
<bean id="httpPaymentService" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
?
??? <property name="mappings">
?
????? <props>
?
???????? <prop key="/pay.service">httpPaymentService</prop>
?
????? </props>
?
??? </property>
?
? </bean>
Spring的HTTP invoker是作为一个两全其美的远程调用解决方案出现的,把HTTP交流的简单性和Java内置的对象序列化机制结合起来。这让HTTP invoker服务成为一个引人注目的对RMI或是对Hessian/Burlap的替代品。
要记住HTTP invoker有个重大的限制,它是一个只在Spring框架中提供的远程调用解决方案。这就意味着客户端和服务器端都必须是使用Spring的应用。
?
五.使用EJB
虽然Spring提供了大量的功能,让POJO具有EJB的能力,但你或许不能总是享受在完全没有EJB的项目上工作的奢侈。一方面,你可能会接触一些其他系统,它们的功能是通过无状态的会话EJB开放出来的。另一方面,你可能被放在一个项目中,由于正统技术(或者可能是政治)的原因,你不得不写EJB代码。
不管你的应用是EJB客户端,还是你必须写EJB本身,你都不需要为了用EJB,完全放弃Spring带来的好处。Spring有两种方法提供对EJB的支持:
??? Spring能让你在Spring的配置文件里,把EJB作为Bean来声明。这样,把EJB引用置入到其他Bean的属性里就成为可能了,好像EJB就是另一个POJO。
??? Spring能让你写EJB,让EJB成为Spring配置的Bean的代理的工作。
?
六、使用JAX-RPC的Web Service
JAX-RPC是“基于XML的远程调用的Java API(Java APIs for XML-based remote procedure call)”的缩写。这是一个口语化的词,仅仅意味着JAX-RPC是Java程序使用XML访问远程服务的一种方式。特别地,这个服务是指用SOAP(Simple Object Access Protocol)协议公开它们的功能的web service。
?
七、小结
Spring提供了远程服务的支持,让使用远程服务和使用常规的JavaBean一样简单。
在客户端,Spring提供了代理工厂Bean,能让你在Spring应用中配置远程服务。不管是使用RMI、Hessian、Burlap、HTTP invoker、EJB、还是Web service,你都可以把远程服务置入到你的应用里,好像它们是POJO一样。Spring甚至捕获了所有抛出的RemoteException,并在发生异常的地方重新抛出运行时RemoteAccessException,让你的代码从处理可能不可恢复的异常中解放出来。
??? Spring的远程调用我不知什么时候才能用上,在这里在不太理解的基础上对书作了简单的摘抄,先留个记号等以后用着了在回头学习。
?
http://aini999.taobao.com