您的位置:首页 > 编程语言 > Java开发

Spring学习笔记19

2009-04-14 11:29 344 查看

使用Hessian和Burlap

Hessian和Burlap是两个由Caucho技术提供的解决方案。它们允许轻量级的HTTP远程服务。尽可能地保持API和通讯协议的简化从而达到简化web service的目的。
虽然Hessian和Burlap都旨在解决同一问题,但它们还是有一些不同。Hessian和RMI一样都是用二进制消息进行C/S通讯,但是和RMI不同的是它所使用的二进制消息可以移植到包括PHP,Python,C++和C#在内的语言平台上。当然,Java不行。另一方面,Burlap是基于XML的远程技术,它可以自动地移植到能够解析XML的任何语言上,而且它比Hessian更加易读。但和其他基于XML的远程技术(SOAP或XML-RPC)不同,Burlap的消息结构非常简单而且不需要一个外部的定义语言(WSDL或IDL)。
Hessian和Burlap都是轻量级的,每一个都是84k的jar文件,而且不需要除JRE外的任何库依赖。非常适于在有内存限制的环境中使用,例如Applet或手提设备上。
在绝大多数情况下,Hessian和Burlap是一样的,唯一的不同在于Hessian消息是二进制的,Burlap消息是XML格式的。Hessian的优势在于可以获得更多的带宽。如果你更在于可读性(便于调试),Burlap的XML就更适合你。
为了说明Hessian和Burlap的区别,我们回顾一下citation服务的问题:
1.
访问Hessian/Burlap服务
你可能还记得,我们用RMI实现过这个服务。当时RantServiceImpl类并不知道citaion服务是一个RMI服务,它只处理CitationService接口。所有的RMI细节都被封装在Spring配置文件中的bean配置中。这样做的好处在于因为客户忽略了服务的具体实现,因此就可以很方便地实现从RMI客户到Hessian客户的转变,而这个过程不需要修改客户代码。你只需要用HessianProxyFactoryBean替换RmiProxyFactoryBean,例如:
<bean id="citationService"

class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl">
<value>http://${serverName}/${contextPath}/citation.service</value>
</property>
<property name="serviceInterface">
<value>com.tickettodriver.CitationService</value>
</property>
</bean>
与基于RMI的服务一样,serviceInterface属性指定了服务实现了的接口,并且serviceUrl属性指定了服务的URL。因为Hessian是基于HTTP的,这里就设置了一个HTTP的URL。
Burlap的情况与之完全一样,你只需要使用BurlapProxyFactoryBean来替换HessianProxyFactoryBean即可,其他的完全一样。由此可以看出,在Spring中任意切换各种远程技术是非常简单的。
2.
使用Hessian/Burlap开放功能
即使没有Spring,编写一个Hessian服务也不困难。你只需编写你的服务类来继承com.caucho.hessian.server.HessianServlet并且确保你的服务方法是public的即可。(Hessian视所有的public方法为服务方法)
因为Hessian服务实现已经很简单了,所以Spring不会在对其进行简化了。如果使用Spring的话,Hessian服务就可以完全利用Spring框架的优点,而这是一个纯Hessian服务所不能够的。
导出Hessian服务
Spring中输出一个Hessian服务类似于实现一个RMI服务。为了输出一个RMI服务,我们配置了RmiServiceExporter bean。同样地,为了输出一个Hessian服务,你需要配置另一个输出bean——HessianServiceExporter。
HessianServiceExporter执行与RmiServiceExporter相同的操作,即它也开放了一个POJO的public方法作为一个Hessian服务的方法。不过具体实现的方法与RMiServiceExporter不同。
HessianServiceExporter是一个Spring MVC控制器,它接受Hessian请求并且将它们转化成方法调用。下面代码展示了Spring中声明HessianServiceExporter来输出citationService bean:
<bean name="hessianCitationService"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service">
<ref bean="citationService" />
</property>
<property name="serviceInterface">
<value>com.tickettodrive.CitationService</value>
</property>
</bean>
和RmiServiceExporter一样,service属性指定了实现服务的bean,在这里是一个citationService
bean,而serviceInterface属性指定为CitationService。和RmiServiceExporter不同的是,你不需要设置serviceName属性。在RMI中,serviceName属性用于注册一个服务。Hessian并不需要注册,因此也不需要来命名一个Hessian服务。
配置Hessian控制器
HessianServiceExporter与RmiServiceExporter的另一个不同在于Hessian是基于HTTP的,所以HessianServiceExporter被实现为Spring的MVC控制器。这就意味着为了使用输出的Hessian服务,我们需要执行两个额外的配置:
·在Spring配置文件中配置一个URL处理器来分发Hessian服务URL到合适的Hessian服务bean
·在web.xml中配置DispatcherServlet并部署你的web应用
在前面我们在客户端配置过serviceUrl属性,令其指向http://${serverName}/${contextPath}/citation.service。这里的${serverName}和${contextPath}都是通配符,在PropertyPlaceholderConfigurer中配置。
一个URL处理器负责映射一个URL模式到一个特定负责处理请求的控制器。在本例中我们需要将/citation.service映射到hessianCitationService bean,例如:
<bean id="urlMapping"

class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/citation.service">hessianCitationSerivce</prop>
</props>
</property>
</bean>
可以看出,mappings属性使用了一组key为URL模式的属性。这里它只是被设置为key为citation.service的单一属性。属性值就是Spring控制器的名称,该控制器负责处理URL模式的请求,在这里是hessianCitationService。
因为HessianServiceExporter被实现为一个Spring MVC的控制器,你还需要在web.xml中配置DispatcherServlet:
<servlet>
<servlet-name>citation</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
给定servlet的名字非常重要,因为DispatcherServlet会使用它来定位Spring配置文件。在本例中,因为servlet被命名为citation,所以配置文件必须被命名为citation-servlet.xml。
最后,我们还需要创建servlet mapping:
<servlet-mapping>
<servlet-name>citation</servlet-name>
<url-pattern>*.service</url-pattern>
</servlet-mapping>
这种配置会将所有URL以.service结尾的请求发送给DispatcherServlet,然后DispatcherServlet会把请求传递给URL映射的控制器(Controller)。所以,映射到/citation.service的请求最终会由hessianCitationService bean(实际上就是一个CitationServiceImpl的代理)处理。
如果你不喜欢Hessian的二进制消息,你可能倾向于导出一个基于XML的Burlap服务。
导出Burlap服务
BurlapServiceExporter实际上和HessianServiceExporter一样,只是它处理的是基于XML的消息。下面的bean定义展示了如何使用BurlapServiceExporter作为一个Burlap服务导出citation服务:
<bean name="burlapCitationService"
class="org.springframework.remoting.caucho.BurlapServiceExporter">
<property name="service">
<ref bean="citationService" />
</property>
<property name="serviceInterface">
<value>com.tickettodrive.CitationService</value>
</property>
</bean>
值得注意的,除了bean名称和使用BurlapServiceExporter,这个bean声明和hessianCitationService的完全一样,都包括创建一个URL handler和DispatcherServlet。
因为Hessian和Burlap都是基于HTTP的,所以它们不会存在防火墙的问题。另外,它们都是轻量级的,可以被应用于内存和硬盘空间不足的受限环境中,例如applet和无线设备。
但是RMI在序列化由RPC消息发送的对象上更胜一筹。RMI使用Java自己的序列化机制。如果你的数据模型很复杂,Hessian/Burlap的序列化模型可能就不能满足你的要求了。不过有个两全其美的方法。Spring提供了HTTP invoker,这个invoker会提供经由HTTP传输的RPC(如Hessian/Burlap),而同时又使用了Java的序列化对象(如RMI)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: