zoukankan      html  css  js  c++  java
  • 使用远程服务

    **访问和发布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可以做到这一点

  • 相关阅读:
    CGO入门和OCR文字识别(非第三方API,有源码,效果好)实战
    Golang中如何正确的使用sarama包操作Kafka?
    音量强度转分贝db
    ShowDialog()弹出的窗体,关闭后,主窗体会闪烁的BUG
    小鱼提问3 static方法中可以访问某个类的私有变量吗(不通过反射的其他非正常手段)?什么情况下可以?
    “-="的陷阱
    c++ 从一个BYTE[] *filePtr 追加二进制文件
    Android解决程序切换后台被干掉,恢复状态问题
    Cookie
    dede后台搜索标签
  • 原文地址:https://www.cnblogs.com/duan2/p/8994747.html
Copyright © 2011-2022 走看看