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都是耳熟能详,下次再说。
原文地址:https://www.cnblogs.com/chenying99/p/2555574.html