zoukankan      html  css  js  c++  java
  • 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都是耳熟能详,下次再说。
  • 相关阅读:
    CSS3特效----制作3D旋转照片展示区
    CSS3知识点整理(四)----布局样式及其他
    CSS3特效----制作3D旋转导航
    工作中遇到的问题--Hibernate一对多保存简化Service层代码
    工作中遇到的问题--BindException
    工作中遇到的问题--Hibernate注解添加在一方和多方的区别
    工作中遇到的问题--使用DTO减少数据字段
    工作中遇到的问题--实现程序运行时就加载CustomerSetting的第二种方法
    工作中遇到的问题--实现CustomerSetting的实时更新
    Hibernate--Enum类型的set集合映射到数据库(xml配置文件实现方式)
  • 原文地址:https://www.cnblogs.com/chenying99/p/2555574.html
Copyright © 2011-2022 走看看