duan2

导航

 

**访问和发布RMI服务
**使用Hessian和Burlap服务
**使用Spring的HTTP invoker
**使用Spring开发Web服务

 

想象一下,我们被困在一个荒凉的小岛上,这听上去就像是一场梦境变成了现实。毕竟,谁不想在海滩上静静地独处,可以幸福地不顾外面世界的纷纷扰扰呢?但是在一个荒岛上,我们不可能总是享受冰镇果汁朗姆酒和日光浴,就算我们能享受这样宁静的隐居生活,但是过不了多久我们就会感到饥饿、厌烦和孤独。在这样的时光里,我们只能以椰子和用叉子所捕的鱼为生。我们终究还是需要食物、新的衣服以及其他供给。而且如果不能和其他人取得联系,不久我们就只能和排球说话了!我们开发的很多应用就像被遗弃的荒岛。表面上看,它们好像能自给自足,但实际上,它们可能还需要和其他系统相互合作,这些系统既包括组织内部的也包括组织外部的。例如,采购系统需要与厂商的供应链系统通信;公司的人力资源系统可能需要集成薪金系统;或者,薪金系统需要和打印、邮寄工资等外部系统进行通信。无论哪种情况,我们的应用都需要和其他系统进行交互,远程访问它们的服务。作为一个Java开发者,我们有多种可以使用的远程调用技术,包括:

远程方法调用(Remote Method Invocation,RMI);
Caucho的Hessian和Burlap;
Spring基于HTTP的远程服务;
使用JAX-RPC和JAX-WS的Web Service。

不管我们选择哪种远程调用技术,Spring为使用这几种不同的技术访问和创建远程服务都提供了广泛的支持。在本章,我们将学习Spring如何简化和完善这些远程调用服务。但是首先,让我们先简要了解一下远程调用是如何在Spring中工作的

 

1.1Spring远程调用概览

 

 

不管你选择哪种远程调用模型,我们会发现Spring都提供了风格一致的支持。这意味着一旦理解了如何配置Spring来使用其中的一种模型,如果我们决定使用另外一种模型的话,将拥有非常低的学习曲线。在所有的模型中,服务都作为Spring所管理的bean配置到我们的应用中。这是通过一个代理工厂bean实现的,这个bean能够把远程服务像本地对象一样装配到其他bean的属性中去。图15.2展示了它是如何工作的。

 

1.2使用Hessian和Burlap发布远程服务

  Hessian和Burlap是Caucho Technology提供的两种基于HTTP的轻量级远程服务解决方案。借助于尽可能简单的API和通信协议,它们都致力于简化Web服务。

你可能会好奇,为什么Caucho对同一个问题会有两种解决方案。Hessian和Burlap就如同一个事物的两面,但是每一个解决方案都服务于略微不同的目的。

  Hessian,像RMI一样,使用二进制消息进行客户端和服务端的交互。但与其他二进制远程调用技术(例如RMI)不同的是,它的二进制消息可以移植到其他非Java的语言中,包括PHP、Python、C++和C#。Burlap是一种基于XML的远程调用技术,这使得它可以自然而然地移植到任何能够解析XML的语言上。正因为它基于XML,所以相比起Hessian的二进制格式而言,Burlap可读性更强。但是和其他基于XML的远程技术(例如SOAP或XML-RPC)不同,Burlap的消息结构尽可能的简单,不需要额外的外部定义语言(例如WSDL或IDL)

  你可能想知道如何在Hessian和Burlap之间做出选择。很大程度上,它们是一样的。唯一的区别在于Hessian的消息是二进制的,而Burlap的消息是XML。由于Hessian的消息是二进制的,所以它在带宽上更具优势。但是如果我们更注重可读性(如出于调试的目的)或者我们的应用需要与没有Hessian实现的语言交互,那么Burlap的XML消息会是更好的选择。

 

使用Hessian和Burlap导出bean的功能

我们只需要编写一个继承com.caucho.hessian.server.HessianServlet的类,并确保所有的服务方法是public的(在Hessian里,所有public方法被视为服务方法)。因为Hessian服务很容易实现,Spring并没有做更多简化Hessian模型的工作。但是和Spring一起使用时,Hessian服务可以在各方面利用Spring框架的优势,这是纯Hessian服务所不具备的。包括利用Spring的AOP来为Hessian服务提供系统级服务,例如声明式事务。

HessianServiceExporter对Hessian服务所执行的功能与RmiServiceExporter对RMI服务所执行的功能是相同的:它把POJO的public方法发布成Hessian服务的方法。不过,正如图15.6所示,其实现过程与RmiServiceExporter将POJO发布为RMI服务是不同的。

 

HessianServiceExporter(稍后会有更详细的介绍)是一个Spring MVC控制器,它接收Hessian请求,并将这些请求转换成对被导出POJO的方法调用。在如下Spring的声明中,HessianServiceExporter会把spitterService bean导出为Hessian服务

 

 

 

 正如RmiServiceExporter一样,service属性的值被设置为实现了这个服务的bean引用。在这里,它引用的是spitterServicebean。serviceInterface属性用来标识这个服务实现了SpitterService接口。与RmiServiceExporter不同的是,我们不需要设置serviceName属性。在RMI中,serviceName属性用来在RMI注册表中注册一个服务。而Hessian没有注册表,因此也就没必要为Hessian服务进行命名。

 

配置Hessian控制器

 

RmiServiceExporter和HessianServiceExporter另外一个主要区别就是,由于Hessian是基于HTTP的,所以HessianSeriviceExporter实现为一个Spring MVC控制器。这意味着为了使用导出的Hessian服务,我们需要执行两个额外的配置步骤:

在web.xml中配置Spring的DispatcherServlet,并把我们的应用部署为 Web应用;

在Spring的配置文件中配置一个URL处理器,把Hessian服务的URL分发给对应的Hessian服务bean。

 

我们在第5章学习了如何配置Spring的DispatcherServlet和URL处理器,所以这些步骤看起来有些熟悉。首先,我们需要一个DispatcherServlet。还好,这个我们已经在Spittr应用的web.xml文件中配置了。但是为了处理Hessian服务,DispatcherServlet还需要配置一个Servlet映射来拦截后缀为“*.service”的URL

这样配置后,任何以“.service”结束的URL请求都将由DispatcherServlet处理,它会把请求传递给匹配这个URL的控制器。因此“/spitter.service”的请求最终将被hessianSpitterServicebean所处理(它实际上仅仅是一个SpitterServiceImpl的代理)。

那我们是如何知道这个请求会转给hessianSpitterSevice处理呢?我们还需要配置一个URL映射来确保DispatcherServlet把请求转给hessianSpitterService。如下的SimpleUrlHandlerMappingbean可以做到这一点

 

posted on 2018-05-05 14:59  duan2  阅读(210)  评论(0编辑  收藏  举报