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 -->