Spring整合hessian和burlap及自带的Invoker

  Hessian和Burlap都是基于HTTP的,解决了RMI头疼的防火墙问题。并且它们都是非常轻量级的,足以在内存或空间受限制的环境下使用,例如applet和无线设备。

 

    Hessian是基于二进制码的传输方式,Burlap是基于XML的传输方式,前者在网络传输的上具有优势,后者在没有实现Hessian(JAVA)语言或可读性上更具优势。

 

    废话不多,最关心的是怎么配置,既然有spring做框架,就舍弃配置繁琐的纯Hessian和Burlap的方式。这两者的配置方式是大同小异的。需要导入两个包dist/modules/spring-webmvc.jar和/lib/caucho/hessian.jar

 

    主要是配置文件,服务的话随便写接口方法即可。由于是基于http,必须起web服务,通过spring的mvc适配器把请求转发给hessian和burlap。

 

    服务器端web.xml

 <!-- 赋给servlet的名字很重要,他是被dispatcherservlet用来定位Spring配置文件,

    由于这个servlet的名字叫hessian,所以这个配置文件必须叫hessian-servlet.xml,([servelt-name]-servlet.xml)
    而且,路径应该是/WEB-INF/...
      -->
     < servlet >
         < servlet-name >hessian </ servlet-name >
         < servlet-class >org.springframework.web.servlet.DispatcherServlet </ servlet-class >
         < load-on-startup >1 </ load-on-startup >
     </ servlet >
     < servlet-mapping >
         < servlet-name >hessian </ servlet-name >
         < url-pattern >/hessian.service </ url-pattern >
     </ servlet-mapping >
    
     <!--  Burlap的配置是类似的  -->
     < servlet >
         < servlet-name >burlap </ servlet-name >
         < servlet-class >org.springframework.web.servlet.DispatcherServlet </ servlet-class >
         < load-on-startup >2 </ load-on-startup >
     </ servlet >
     < servlet-mapping >
         < servlet-name >burlap </ servlet-name >
         < url-pattern >/burlap.service </ url-pattern >
     </ servlet-mapping >

hessian-servlet.xml和burlap-servlet.xml极其雷同 

 <!-- 服务 -->

     < bean  id ="myService"  class ="org.spring.rmi.yoara.MyServiceImpl" />
    
     <!--  hessian是基于Http的二进制码传输的轻量级框架  -->
     < bean  id ="hessianExporter"  class ="org.springframework.remoting.caucho.HessianServiceExporter" >
         <!--  服务  -->
         < property  name ="service"  ref ="myService" />
         <!-- hessian没有类似rmi服务注册表,不需要用服务名注册,  -->
         <!--  绑定服务的路径  -->
         < property  name ="serviceInterface"  value ="org.spring.rmi.yoara.MyService" />
     </ bean >
     <!--  2.5.6版本相应的jar包在dist/modules/spring-webmvc   -->
     < bean  id ="hessianMapping"  class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
         < property  name ="mappings" >
             < props >
                 < prop  key ="/hessian.service" >hessianExporter </ prop >
             </ props >
         </ property >
     </ bean >
     <!--  因为hessianExporter在SpringMVC里面作为一个controller实现的,所以还需要在web.xml中配置  -->

burlap现在已经集成到hessian.jar中,不作为一个单独的项目了

<!--  服务 ,需要引入/lib/caucho/hessian.jar -->
     < bean  id ="myService"  class ="org.spring.rmi.yoara.MyServiceImpl" />
    
     <!--  burlap是基于xml传输的轻量级框架  -->
     < bean  name ="burlapExporter"  class ="org.springframework.remoting.caucho.BurlapServiceExporter" >
         <!--  服务  -->
         < property  name ="service"  ref ="myService" />

         <!--  绑定服务的路径  -->
         < property  name ="serviceInterface"  value ="org.spring.rmi.yoara.MyService" />
     </ bean >

     < bean  id ="urlMapping"  class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
         < property  name ="mappings" >
             < props >
                 < prop  key ="/burlap.service" >burlapExporter </ prop >
             </ props >
         </ property >

    </bean> 

完了,服务器端只需要配置文件,和简单的service类即可,如代码中myService。

 

    客户端,用spring配置的方式

< bean  id ="goService"  class ="org.springframework.remoting.caucho.HessianProxyFactoryBean" >
         <!--  服务URL  -->
         < property  name ="serviceUrl"  value ="http://localhost:8080/SpringServer/hessian.service" />
         <!--  本地接口路径  -->
         < property  name ="serviceInterface"  value ="org.spring.rpc.yoara.MyService" />

    </bean> 

 注意hessian.service这个是在服务器端配置的映射路径,其实就是servlet差不多。客户端有相应的服务接口就成了。

 

    但当序列化RPC消息发来的对象时,RMI就把Hessian和Burlap打败了,因为Hessian和Burlap都是采用了自己的私有的序列化机制,而RMI是使用的JAVA本身的序列化机制,如果你的数据模型非常复杂,Hessian/Burlap的序列化模型可能就不够用了。

 

    一个两全齐美的方法就是SPring的HTTP invoker,他在HTTP之上提供了RPC(Hessian/Burlap),同时使用了Java的对象序列化机制(RMI)。

 

    其实invoker的配置和前面一模一样的,就是更改了Exporter。不用看了。

< bean  id ="invokerExporter"  class ="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter" >
         <!--  服务  -->
         < property  name ="service"  ref ="myService" />
         <!--  绑定服务的路径  -->
         < property  name ="serviceInterface"  value ="org.spring.rmi.yoara.MyService" />
     </ bean >
     <!--  2.5.6版本相应的jar包在dist/modules/spring-webmvc   -->
     < bean  id ="invokerMapping"  class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
         < property  name ="mappings" >
             < props >
                 < prop  key ="/invoker.service" >invokerExporter </ prop >
             </ props >
         </ property >

    </bean>

 web.xml配置

 <!-- invoker的配置也是类似的 -->

     < servlet >
         < servlet-name >invoker </ servlet-name >
         < servlet-class >org.springframework.web.servlet.DispatcherServlet </ servlet-class >
         < load-on-startup >3 </ load-on-startup >
     </ servlet >
     < servlet-mapping >
         < servlet-name >invoker </ servlet-name >
         < url-pattern >/invoker.service </ url-pattern >
     </ servlet-mapping >
 好,除了EJB,剩下的就是soap方式的webservice了。xfire都是耳熟能详,下次再说。

你可能感兴趣的:(hessian)