http://www.kompakar.com.cn/discuz/viewthread.php?tid=93&extra=page=16.4 使用Spring HTTP invoker进行远程调用Spring开发小组意识到在RMI服务和基于 HTTP的服务(如Hessian和Burlap)之间的空白。一方面,RMI使用Java标准的对象序列化,但很难穿越防火墙;另一方面, Hessian/Burlap能很好地穿过防火墙工作,但使用自己私有的一套对象序列化机制。就这样,Spring的HTTP invoker应运而生。HTTP invoker是一个新的远程调用模型,作为Spring框架的一部分,来执行基于HTTP的远程调用(让防火墙高兴的事),并使用Java的序列化机制(让程序员高兴的事)。使用基于HTTP invoker的服务和使用基于Hessian/Burlap的服务非常相似。为了开始学习HTTP invoker,让我们再来看一下这个支付服务——这一次将作为HTTP invoker支付服务来实现。6.4.1 通过HTTP访问服务要访问RMI服务,得声明一个指向这个服务的 RmiProxyFactoryBean;要访问Hessian服务,得声明一个HessianProxyFactoryBean.;要访问Burlap 服务的话,得用BurlapProxyFactoryBean。把这样千篇一律的用法带到HTTP invoker上,应该也不会带来什么惊奇,那就是访问一个HTTP invoker服务,你需要使用HttpInvokerProxyFactoryBean。要让支付服务作为一个HTTP invoker服务公开,得配置一个Bean,用HttpInvokerProxyFactoryBean来代理它,如下所示: <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> 把这个Bean的定义和那些在6.2.1节、6.3.1节中的比较一下,你会发现几乎没什么变化。serviceInterface属性仍然用来表示这个支付服务所实现的接口;serviceUrl属性仍然是用来表示远程支付服务的位置。由于HTTP invoker是基于HTTP的,如同Hessian和Burlap一样,serviceUrl就能包含与Hessian和Burlap版本的Bean里一样的URL。现在,让我们转到HTTP invoker对话的另一面,看看如何把Bean的功能作为基于HTTP invoker的服务输出。6.4.2 把Bean作为HTTP服务公开你已经看到如何把 PaymentServiceImpl的功能作为RMI服务公开,或者是作为Hessian服务,以及Burlap服务。接下来,我们要把这个支付服务改写为HTTP invoker服务,用Spring的HttpInvokerServiceExporter来输出这个支付服务。为了避免听上去有违反先例的危险,我们必须告诉你,使用HttpInvokerServiceExporter把Bean的方法输出为远程方法,和你已经看到的其他远程服务的exporter做事的方法非常相像。实际上,就是一样的。举例来说,下面的Bean的定义展示了如何把paymentService Bean作为一个远程的基于HTTP invoker的服务输出: <bean id="httpPaymentService" class="org.springframework.remoting. ➥httpinvoker.HttpInvokerServiceExporter"> <property name="service"> <ref bean="paymentService"/> </property> <property name="serviceInterface"> <value>com.springinaction.payment.PaymentService</value> </property></bean> 有点奇怪的似曾相识的感觉吗?你很难找出这个 Bean的定义和那些在6.3.2节中的不同来。这里的粗体字不是帮你发现它的,而是惟一的区别就在于使用了 HttpInvokerServiceExporter。否则的话,这个exporter和其他的远程服务的exporter就没什么区别了。基于HTTP invoker的服务,顾名思义,是基于HTTP的,就像Hessian和Burlap服务一样。并且,也和 HessianServiceExporter和BurlapServiceExporter那样, HttpInvokerServiceExporter也是一个Spring的Controller。这就意味着你需要建立一个URL处理器,把HTTP URL映射到服务上: <bean id="urlMapping" class="org.springframework.web. ➥servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/pay.service">httpPaymentService</prop> </props> </property> </bean>同时你也需要把这个支付服务部署到web应用中,通过在web.xml中配置Spring的DispatcherServlet: <servlet> <servlet-name>credit</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>credit</servlet-name> <url-pattern>*.service</url-pattern> </servlet-mapping> 这样配置,支付服务便能通过/pay.service获得,和它作为Hessian服务或Burlap服务公开时的URL一样。Spring的HTTP invoker是作为一个两全其美的远程调用解决方案出现的,把HTTP交流的简单性和Java内置的对象序列化机制结合起来。这让HTTP invoker服务成为一个引人注目的对RMI或是对Hessian/Burlap的替代品。要记住HTTP invoker有个重大的限制,它是一个只在Spring框架中提供的远程调用解决方案。这就意味着客户端和服务器端都必须是使用Spring的应用。并且,至少就目前而言,也暗示了客户端和服务器端都必须是基于Java的[2]。到现在为止我们所讨论的所有远程技术中,没有一个受到比Enterprise JavaBean (EJB)更多的关注。甚至可以说,有关EJB的出版物比任何其他Java技术都要多。让我们看一下如何把EJB用到你的Spring应用中。转自:《Spring in Action中文版》 人民邮电出版社 ISBN:7115143153 定价:39元
转载请注明原文地址: https://ibbs.8miu.com/read-20660.html