Spring remoting简单例子

令狐宜民
2023-12-01

Spring目前提供了对RMI、HttpInvoker、Hessian、Burlap及WebService等Remoting技术的集成。Spring屏蔽了这些实现技术的差异,用户只需开发简单的Java对象(Plain Old Java Objects,POJO)然后按照Spring规定的格式进行配置文件的编写即可。

6.2.1  Hessian使用演示

【例6.1】在Spring中使用Hessian Remoting技术。

下面就来演示一下在Spring中是如何使用Hessian Remoting技术的。Hessian、Burlap、HttpInvoker等是要运行在支持Servlet的Web服务器中的,因此在运行例子之前要安装配置好Web服务器。Web服务器配置完毕以后按照下面的步骤编写代码。

(1) 编写业务接口:

// IWordProcessor业务接口

public interface IWordProcessor

{

    /**

     * 抽取value中的中文

     * @param value

     * @return

     */

    public String extractChinese(String value);

}

(2) 编写实现类:

// 实现类

public class WordProcessorImpl implements IWordProcessor

{

    public String extractChinese(String value)

    {

        Pattern p = Pattern.compile("[\\u4E00-\\u9FFF]+");

        Matcher matcher = p.matcher(value);

        StringBuffer sb = new StringBuffer();

        while (matcher.find())

        {

            sb.append(matcher.group());

        }

        return sb.toString();

    }

}

(3) 修改Web工程中的web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 
    2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<!-- 通过Spring的一个Servlet来完成对Hessian的代理 -->

 <servlet>

    <servlet-name>remote</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet<
        /servlet-class>

     <load-on-startup>1</load-on-startup>

 </servlet>

<servlet-mapping>

      <servlet-name>remote</servlet-name>

     <url-pattern>/remote/*</url-pattern>

 </servlet-mapping>

</web-app>

(4) 在Web工程中添加remote-servlet.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean name="/wordProcessorBean" 
    class="com.cownew.Char11.Sec02.WordProcessorImpl">

</bean>

<bean name="/WordProcessorService" 
    class="org.springframework.remoting.caucho.HessianServiceExporter">

<property name="service">

<ref bean="wordProcessorBean" />

</property>
    <property name="serviceInterface">

<value>com.cownew.Char11.Sec02.IWordProcessor</value>

</property>

</bean>

</beans>

(5) 编写客户端测试代码:

// 测试代码

package com.cownew.Char11.Sec02;

import java.net.MalformedURLException;

import com.caucho.hessian.client.HessianProxyFactory;

public class MainApp

{

    public static void main(String[] args)

    {

        HessianProxyFactory proxyFactory = new HessianProxyFactory();

        try

        {

            IWordProcessor service = (IWordProcessor) proxyFactory.create(

                    IWordProcessor.class, "http://localhost:8080/
                        RemoteCall/remote/WordProcessorService");

            System.out.println(
                        service.extractChinese("人来的不少,I'm very 欣慰"));

        } catch (MalformedURLException e)

        {

            e.printStackTrace();

        }

    }

}

运行结果:

人来的不少欣慰

用Web服务器来实现Remoting,确实很神奇!

如果需要改用Burlap,则将上面的HessianServiceExporter改成BurlapServiceExporter,HessianProxyFactory改成BurlapProxyFactory就可以,接口和实现类的代码均不需要修改;同样如果要改用HttpInoker,只要将上面的HessianServiceExporter改成HttpInvokerService- Exporter,将HessianProxyFactory改成HttpInvokerProxyFactoryBean就可以了。

在案例系统开发的最初阶段曾经使用Hessian实现Remoting,后来逐渐发现Hessian不能传递复杂对象的缺点,因此决定切换到Http Invoker,没想到从看资料到最终修改完毕竟然用了不到1分钟时间,其他部分完全不用修改,不得不为Spring折服。

6.2.2  几种Remoting实现的比较

Spring支持的Remoting实现技术是非常多的,虽然Spring屏蔽了这些技术使用上的差异,但是选择一个合适的Remoting技术仍然对系统有非常积极的作用,下面就来讲述这些实现技术的优缺点。

(1) RMI:RMI使用Java的序列化机制实现调用及返回值的编组(marshal)与反编组(unmarshal),可以使用任何可序列化的对象作为参数和返回值。其缺点是RMI只能通过RMI协议来进行访问,无法通过HTTP协议访问,无法穿透防火墙。

(2) Hessian:Hessian也是将网络传输的对象转换为二进制流通过Http进行传递,不过它是使用自己的序列化机制实现的编组与反编组,其支持的数据类型是有限制的,不支持复杂的对象。Hessian的优点是可以透过防火墙。

(3) Burlap:Burlap是将网络传输的对象转换为XML文本格式通过Http进行传递,支持的对象与Hessian相比更少。XML一般比二进制流占用空间大,在网络上传递所需要的时间比二进制流长,XML的解析过程也会耗用更多的内存。Burlap可以穿透防火墙,而且由于传输的格式是XML文本,可以与其他系统(比如.NET)集成,从某种程度来讲,Burlap是一种不标准的WebService。

(4) HttpInvoker:HttpInvoker将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。Http Invoker是使用Http协议传输二进制流的,而同时又具有Hessian、Burlap的优点。

经过比较,并结合案例系统的特点,HttpInvoker在众多实现技术中脱颖而出,因此案例系统的Remoting部分将使用HttpInvoker实现。

<!-- page -->
 类似资料: